class Envirobly::Deployment

def initialize(environ_name:, commit:, account_id:, project_name:, project_id:, region:, shell:)

def initialize(environ_name:, commit:, account_id:, project_name:, project_id:, region:, shell:)
  @environ_name = environ_name
  @commit = commit
  @config = Envirobly::Config.new
  @default_account = Envirobly::Defaults::Account.new(shell:)
  @default_project = Envirobly::Defaults::Project.new(shell:)
  @default_region = Envirobly::Defaults::Region.new(shell:)
  if account_id.blank?
    account_id = @default_account.require_if_none
  end
  if project_id.blank? && project_name.blank?
    project_id = @default_project.value
    if project_id.blank?
      project_name = Envirobly::Defaults::Project.dirname
    end
  end
  if region.blank?
    region = @default_region.require_if_none
  end
  @params = {
    account_id:,
    project_id:,
    project_name:,
    region:,
    deployment: {
      environ_name:,
      commit_ref: @commit.ref,
      commit_time: @commit.time,
      commit_message: @commit.message,
      object_tree_checksum: @commit.object_tree_checksum,
      **@config.to_params
    }
  }
end

def perform(dry_run:)

def perform(dry_run:)
  puts [ "Deploying commit", yellow(@commit.short_ref), faint("→"), green(@environ_name) ].join(" ")
  puts
  puts "    #{@commit.message}"
  puts
  if dry_run
    puts YAML.dump(@params)
    return
  end
  # Create deployment
  api = Envirobly::Api.new
  Envirobly::Duration.measure do
    response = api.create_deployment @params
    unless response.success?
      display_config_errors response.object.fetch("errors")
      exit 1
    end
    print "Preparing project..."
    @default_account.save_if_none response.object.fetch("account_id")
    @default_project.save_if_none response.object.fetch("project_id")
    @default_region.save_if_none response.object.fetch("region")
    # Fetch credentials for build context upload
    @deployment_url = response.object.fetch("url")
    @credentials_response = api.get_deployment_with_delay_and_retry @deployment_url
  end
  credentials = @credentials_response.object.fetch("credentials")
  region = @credentials_response.object.fetch("region")
  bucket = @credentials_response.object.fetch("bucket")
  watch_deployment_url = @credentials_response.object.fetch("deployment_url")
  Envirobly::Duration.measure do
    # Upload build context
    Envirobly::Aws::S3.new(bucket:, region:, credentials:).push @commit
    # Perform deployment
    api.put_as_json @deployment_url
  end
  puts "Follow at #{watch_deployment_url}"
end