# frozen_string_literal: true

require 'travis/cli/setup'
require 'shellwords'

module Travis
  module CLI
    class Setup
      class CodeDeploy < Service
        description 'triggering a new deployment on Amazon CodeDeploy'
        AWS_CONFIG = File.expand_path('.aws/config', ENV['HOME'])

        def run
          if File.readable? AWS_CONFIG
            content           = File.read(AWS_CONFIG)
            access_key        = content[/aws_access_key_id = (\S+)\n/,     1]
            secret_access_key = content[/aws_secret_access_key = (\S+)\n/, 1]
          end

          deploy 'codedeploy' do |config|
            config['access_key_id']     = ask('Access key ID: ') { |q| q.default = access_key if access_key }.to_s
            secret_access_key           = nil unless access_key == config['access_key_id']
            config['secret_access_key'] = secret_access_key || ask('Secret access key: ') { |q| q.echo = '*' }.to_s
            config['bucket']            = ask('S3 Bucket: ').to_s
            config['key']               = ask('S3 Key: ').to_s
            config['bundle_type']       = ask('Bundle Type: ') do |q|
              q.default = config['key'][/\.(zip|tar|tgz)$/, 1]
            end.to_s
            config['application']       = ask('Application Name: ') { |q| q.default = repository.name }.to_s
            config['deployment_group']  = ask('Deployment Group Name: ').to_s
            encrypt(config, 'secret_access_key') if agree('Encrypt secret access key? ') { |q| q.default = 'yes' }
          end

          return unless agree('Also push bundle to S3? ')

          cd = travis_config['deploy']
          s3 = {
            'provider' => 's3',
            'access_key_id' => cd['access_key_id'],
            'secret_access_key' => cd['secret_access_key'],
            'local_dir' => 'dpl_cd_upload',
            'skip_cleanup' => true,
            'on' => cd['on'],
            'bucket' => cd['bucket']
          }

          s3['upload_dir']               = File.dirname(cd['key']) if cd['key'].include? '/'
          travis_config['deploy']        = [s3, cd]
          upload_file_name               = File.basename(cd['key'])
          source_file                    = ask('Source File: ') { |q| q.default = upload_file_name }
          travis_config['before_deploy'] = [
            'mkdir -p dpl_cd_upload',
            "mv #{Shellwords.escape(source_file)} dpl_cd_upload/#{Shellwords.escape(upload_file_name)}"
          ]
        end
      end
    end
  end
end
