require 'thor'
require_relative '../control/clean'

module Builderator
  module Tasks
    class Clean < Thor
      class_option :region,
                   :type => :string,
                   :default => 'us-east-1',
                   :aliases => :r,
                   :desc => 'AWS Region in which to perform tasks'
      class_option :commit,
                   :type => :boolean,
                   :default => false,
                   :desc => 'Perform mutating API calls to cleanup resources'
      class_option :filter,
                   :type => :array,
                   :aliases => :f,
                   :desc => 'Key/value pairs to filter resources (--filter name foo owner_id 123456789)'
      class_option :limit,
                   :type => :boolean,
                   :default => true,
                   :desc => 'By default, limit the number of resources to remove'

      def initialize(*_)
        super

        ## Convert array of filter key-values to a hash
        options['filters'] = Hash[*options['filter']] if options['filter'].is_a?(Array)

        Control::Clean.options(options)
      end

      desc 'configs', 'Delete unused launch configurations'
      def configs
        Control::Clean.configs!(&method(:say_status))
      end

      desc 'images', 'Deregister unused images'
      option 'group-by',
             :type => :array,
             :desc => 'Tags/properties to group images by for pruning'
      option 'sort-by',
             :type => :string,
             :default => 'creation_date',
             :desc => 'Tag/property to sort grouped images on'
      option :keep,
             :type => :numeric,
             :default => 5,
             :desc => 'Number of images in each group to keep'
      def images
        Control::Clean.images!(&method(:say_status))
      end

      desc 'snapshots', 'Delete unused snapshots'
      def snapshots
        Control::Clean.snapshots!(&method(:say_status))
      end

      desc 'volumes', 'Delete unused volumes'
      def volumes
        Control::Clean.volumes!(&method(:say_status))
      end

      desc 'all', 'Clean volumes, launch configs, images, and snapshots in order'
      option 'group-by',
             :type => :array,
             :desc => 'Tags/properties to group images by for pruning'
      option 'sort-by',
             :type => :string,
             :default => 'creation_date',
             :desc => 'Tag/property to sort grouped images on'
      option :keep,
             :type => :numeric,
             :default => 5,
             :desc => 'Number of images in each group to keep'
      def all
        invoke :volumes, [], options
        invoke :configs, [], options
        invoke :images, [], options
        invoke :snapshots, [], options

        ## TODO Print resource counts here.
        return if Control::Clean.exceptions.empty?

        say_status :fail, 'Not all tasks completed successfully. The following '\
          'exceptions occured:', :red
        Control::Clean.exceptions.each do |e|
          say_status(*e.status)
        end
      end
    end
  end
end