module Rudy::CLI
  class Instances < Rudy::CLI::Base
    
    def connect
      puts "Rudy Connect".bright

      if @argv.cmd
        @argv.cmd = [@argv.cmd].flatten.join(' ')
        if @global.user.to_s == "root"
          exit unless Annoy.are_you_sure?(:medium)
        end
      end
      
      rudy = Rudy::Instances.new(:config => @config, :global => @global)
      rudy.connect(@option.group, @argv.cmd, @option.awsid, @option.print)
    end

    def copy_valid?
      raise "You must supply a source and a target. See rudy #{@alias} -h" unless @argv.size >= 2
      raise "You cannot download and upload at the same time" if @option.download && @alias == 'upload'
      true
    end
    def copy
      puts "Rudy Copy".bright
      opts = {}
      opts[:group] = @option.group if @option.group
      opts[:id] = @option.awsid if @option.awsid
      opts[:id] &&= [opts[:id]].flatten
      
      # Is this more clear?
      @option.recursive && opts[:recursive] = true
      @option.preserve  && opts[:preserve]  = true
      @option.print     && opts[:print]     = true
      
      
      opts[:paths] = @argv
      opts[:dest] = opts[:paths].pop
      
      opts[:task] = :download if @alias == 'download' || @option.download
      opts[:task] = :upload if @alias == 'upload'
      opts[:task] ||= :upload
      
      #exit unless @option.print || Annoy.are_you_sure?(:low)
      
      rudy = Rudy::Instances.new(:config => @config, :global => @global)
      rudy.copy(opts[:group], opts[:id], opts)
    end


    def status
      puts "Instance Status".bright
      opts = {}
      opts[:group] = @option.group if @option.group
      opts[:state] = @option.state if @option.state
      
      # A nil value forces the @ec2.instances.list to return all instances
      if @option.all
        opts[:state] = :any
        opts[:group] = :any
      end
      
      opts[:id] = @argv.awsid if @argv.awsid
      opts[:id] &&= [opts[:id]].flatten
      rudy = Rudy::Instances.new(:config => @config, :global => @global)
      
      lt = rudy.list(opts[:state], opts[:group], opts[:id]) do |inst|
        puts '-'*60
        puts "Instance: #{inst.awsid.bright} (AMI: #{inst.ami})"
        puts inst.to_s
      end
      puts "No instances running" if !lt || lt.empty?
    end
    alias :instance :status
    
    def console_valid?
      
      @rmach = Rudy::Instances.new(:config => @config, :global => @global)
    end
    
    def console
      puts "Instance Console".bright
      opts = {}
      opts[:group] = @option.group if @option.group
      opts[:id] = @argv.awsid if @argv.awsid
      opts[:id] &&= [opts[:id]].flatten
      
      unless @rmach.any?
        puts "No instances running"
        return
      end
      
      console = @rmach.console(opts[:group], opts[:id])
      
      if console
        puts console
      else
        puts "Console output is not available"
      end
      
    end
    
    
    def instance_create
      puts "Create Instance".bright
      opts = {}
      [:group, :ami, :address, :itype, :keypair].each do |n|
        opts[n] = @option.send(n) if @option.send(n)
      end

      rmach = Rudy::Instances.new(:config => @config, :global => @global)
      # TODO: Print number of instances running. If more than 0, use Annoy.are_you_sure?
      rmach.create(opts) do |inst| # Rudy::AWS::EC2::Instance objects
        puts '-'*60
        puts "Instance: #{inst.awsid.bright} (AMI: #{inst.ami})"
        puts inst.to_s
      end
    
    end
    
    
    def instance_destroy
      puts "Destroy Instances".bright
      opts = {}
      opts[:group] = @option.group if @option.group
      opts[:id] = @argv.awsid if @argv.awsid
      opts[:id] &&= [opts[:id]].flatten
      
      rmach = Rudy::Instances.new(:config => @config, :global => @global)
      instances = rmach.list(:running, opts[:group], opts[:id])
      raise "No instances running" if instances.nil? || instances.empty?
      puts "Destroying #{instances.size} instances in #{instances.first.groups.first}"
      exit unless Annoy.are_you_sure?(:low)
      rmach.destroy(opts[:group], opts[:id])
      puts "Done!"
    end
    
  end
end