require ‘comodule’

namespace :comodule do

def platform
  return @platform if @platform
  platform_name = @args && @args.platform_name
  env = {}

  ['project_root', 'db_host', 'db_password', 'RAILS_ENV', 'env'].each do |env_name|
    env[env_name.to_sym] = ENV[env_name] if ENV[env_name]
  end

  @platform = Comodule::Deployment::Platform.new(platform_name, env)
end

task :variables do |cmd, args|
  @args = args
end

namespace :platform do

  desc 'Create necessary directories and files for the platform'
  task :create, [:platform_name] => [:environment, :variables] do
    platform.create
  end

  desc 'Upload secret files'
  task :upload_secret_files, [:platform_name] => [:environment, :variables] do
    platform.upload_secret_files
  end

  desc "Download secret files"
  task :download_secret_files, [:platform_name] => [:environment, :variables] do
    platform.download_secret_files
  end

  desc "Upload project files"
  task :upload_project, [:platform_name] => [:environment, :variables] do
    platform.upload_project
  end

  desc 'Validate cloudFormation stack'
  task :validate_template, [:platform_name] => :variables do
    platform.cloud_formation.validate_template
  end

  desc 'Create cloudFormation stack'
  task :create_stack, [:platform_name] => :variables do
    platform.cloud_formation.create_stack
  end

  desc 'Delete cloudFormation stack'
  task :delete_stack, [:platform_name] => :variables do
    platform.cloud_formation.delete_stack
  end

  desc 'Provisioning'
  task :provision, [:platform_name] => :variables do
    platform.deploy
  end

  namespace :ssl do

    desc "Describe IAM server certificates"
    task :describe, [:platform_name] => :variables do
      platform.ssl.describe
    end

    desc "Upload IAM server certificate"
    task :upload, [:platform_name] => :variables do
      platform.ssl.upload
    end

    desc "Delete IAM server certificate"
    task :delete, [:platform_name] => :variables do
      platform.ssl.delete
    end
  end

  namespace :test do

    desc 'Test of upload secret files'
    task :upload_secret_files, [:platform_name] => [:environment, :variables] do
      platform.upload_secret_files_test
    end

    desc "Test of download secret files"
    task :download_secret_files, [:platform_name] => [:environment, :variables] do
      platform.download_secret_files_test
    end
  end
end

end