class Pfm::Command::Base

def build_base_dir

def build_base_dir
  "#{SETTINGS['BUILD_BASE_DIR']}/#{@params.first}"
end

def build_dir

def build_dir
  "#{@workspace.tmp_dir}/#{build_base_dir}".freeze
end

def build_exists?

def build_exists?
  return true if Dir.exist? build_base_dir
  # doesn't exist
  @errors.push("Build::#{@params.first} doesnt exist")
  false
end

def build_setup

def build_setup
  Packer::Binary.configure do |config|
    config.version = SETTINGS['PACKER_VERSION']
    config.download_path = "/tmp/#{SecureRandom.uuid}"
  end
  @build_config = Idlc::Build::Config.new(SETTINGS['AWS_REGION'])
  @workspace.add(build_base_dir)
  build_dir = "#{@workspace.tmp_dir}/#{build_base_dir}".freeze
  msg("Using build template: Build::#{@params.first}::#{@config[:build_template]}::#{@config[:build_metadata]}")
  # Include build metadata
  @build_metadata = Idlc::Build::Metadata.new(@params.first, @config[:build_metadata])
  # load the rest of the metadata
  @build_metadata.load
  # load version from command line if specified
  @build_metadata.attributes['version'] = Idlc::Build::Metadata::MetadataAttribute.new(@config[:build_version], true) unless @config[:build_version].nil?
  # check metadata requirements
  @build_metadata.requirements_satisfied?
  msg("Template Version: #{@build_metadata.attributes['version'].value}")
  @build_metadata.attributes.each do |key, att|
    # load metadata file as packer user vars
    @build_config.add_build_var_v2(key, att.value)
  end
  # Copy over the base template and auxillary files for Packer
  tpl = Idlc::Build::Template.new(
    @build_metadata.attributes,
    "#{build_dir}/build.json"
  )
  tpl.write
  # copy auxiliary files
  system("cp -a #{templates_dir}/files #{build_dir}")
  Dir.chdir(build_dir)
end

def deploy_setup

def deploy_setup
  Terraform::Binary.configure do |config|
    config.version = SETTINGS['TERRAFORM_VERSION']
    config.download_path = "/tmp/#{SecureRandom.uuid}"
  end
  raise InvalidRepository, 'This doesn\'t look like a valid infrastructure repository' unless File.directory? "#{inf_base_dir}/tf"
  config = Idlc::Deploy::Config.new(SETTINGS['AWS_REGION'])
  config.parse("#{inf_base_dir}/env/config/default.yml") if File.exist? "#{inf_base_dir}/env/config/default.yml"
  if ENV['PROD'] == 'true' || ENV['PROD'] == '1'
    config.parse("#{inf_base_dir}/env/config/prod.yml")
  else
    config.parse("#{inf_base_dir}/env/config/devtest.yml")
  end
  config.parse("#{inf_base_dir}/env/size/#{ENV['SIZE']}.yml") if File.exist? "#{inf_base_dir}/env/size/#{ENV['SIZE']}.yml"
  inf_conf_file = 'inf.config.yml'
  # For unit tests
  inf_conf_file = 'inf.config.example.yml' unless File.exist? inf_conf_file
  config.parse(inf_conf_file)
  bucket_name = Idlc::Deploy::Config.get_deployment_var('tfstate_bucket')
  sub_bucket = "#{Idlc::Deploy::Config.get_deployment_var('job_code')}"\
    "#{Idlc::Deploy::Config.get_deployment_var('job')}"\
    "-#{Idlc::Deploy::Config.get_deployment_var('env')}".freeze
  # Pass some ENV vars for Terraform
  Idlc::Deploy::Config.add_deployment_var('environment_key', sub_bucket)
  Idlc::Deploy::Config.add_deployment_var('version', REPO_VERSION)
  Idlc::Deploy::Config.add_deployment_var('major_minor', Idlc::Utility.major_minor(REPO_VERSION))
  Idlc::Deploy::Config.add_deployment_var('major_minor_patch', Idlc::Utility.major_minor_patch(REPO_VERSION))
  Idlc::Deploy::Config.add_deployment_var('build', @config[:server_build])
  Idlc::Deploy::Config.add_deployment_var('app_release', @config[:app_release])
  Idlc::Deploy::Keypair.generate("#{inf_base_dir}/env/kp")
  @workspace.flatten("#{inf_base_dir}/tf", 'tf')
  @workspace.add("#{inf_base_dir}/env/kp")
  @workspace.add('lib/tf/modules')
  config.configure_state(bucket_name, sub_bucket, @workspace.tmp_dir)
end

def deploy_setupv2

def deploy_setupv2
  Terraform::Binary.configure do |config|
    config.version = SETTINGS['TERRAFORM_VERSION']
    config.download_path = "/tmp/#{SecureRandom.uuid}"
  end
  # Create dynamic variables file for terraform based on config
  keys = {}
  vars_file = ''
  env_metadata = JSON.parse(open(@config[:config_file]).read)
  ['account', 'environment', 'ec2', 'application'].each do |section|
    env_metadata[section].each do |key, value|
      # skip dups
      next unless keys[key].nil?
      # replace null with empty string
      value = '' if value.nil?
      # skip lists and maps
      next unless (value.instance_of? String)
      # add to vars file and record key for dups
      keys[key] = 'parsed'
      vars_file += <<~EOH
        variable "#{key}" {}
      EOH
      # load value into envrionment
      Idlc::Deploy::Config.add_deployment_var(key, value)
    end
  end
  # write vars file
  File.open("#{config[:working_dir]}/#{env_metadata['environment_key']}-tfvars.tf", 'w') { |file| file.write(vars_file) }
  # Pass some extra vars for Terraform
  Idlc::Deploy::Config.add_deployment_var('aws_region', SETTINGS['AWS_REGION'])
  Idlc::Deploy::Config.add_deployment_var('environment_key', env_metadata['environment_key'])
  Idlc::Deploy::Config.add_deployment_var('version', env_metadata['environment']['inf_version'])
  Idlc::Deploy::Config.add_deployment_var('app_release', @config[:app_release])
  Idlc::Deploy::Config.add_deployment_var('encrypted_svc_pass', env_metadata['environment']['encrypted']['svc_pass'])
  ENV['APP_RELEASE'] = @config[:app_release]
  FileUtils.mkdir_p "inf/env/kp"
  Idlc::Deploy::Keypair.generate("inf/env/kp")
  config = Idlc::Deploy::Config.new(SETTINGS['AWS_REGION'])
  config.configure_state(
    env_metadata['account']['tfstate_bucket'],
    env_metadata['environment_key'],
    @config[:working_dir]
  )
end

def inf_base_dir

def inf_base_dir
  SETTINGS['INF_BASE_DIR']
end

def initialize

def initialize
  super
  @workspace = Idlc::Workspace.new
end

def needs_help?(params)

def needs_help?(params)
  params.include?('-h') || params.include?('--help')
end

def needs_version?(params)

def needs_version?(params)
  params.include?('-v') || params.include?('--version')
end

def run_with_default_options(params = [])


handled here.
In order to control this behavior, make sure the default options are
optparser overwrites -h / --help options with its own.
def run_with_default_options(params = [])
  if needs_help?(params)
    msg(opt_parser.to_s)
    0
  elsif needs_version?(params)
    msg("Pfm Version: #{Pfm::VERSION}")
    0
  else
    ENV['DEBUG'] = 'true' if verbose?(params)
    run(params)
  end
rescue NameError => e
  err("ERROR: #{e.message}\n")
  1
rescue OptionParser::InvalidOption, OptionParser::MissingArgument => e
  err("ERROR: #{e.message}\n")
  msg(opt_parser)
  1
rescue Idlc::Build::MissingMetadataFile, Idlc::Build::MissingRequiredMetadataAttribute, InvalidRepository => e
  err("ERROR: #{e.message}\n")
  1
ensure
  @workspace.cleanup unless @workspace.empty?
end

def templates_dir

def templates_dir
  "#{__dir__}/templates/#{@build_metadata.attributes['build_stage'].value}"
end

def verbose?(params)

def verbose?(params)
  params.include?('-V') || params.include?('--verbose')
end