require "shelly/cli/command"

module Shelly
  module CLI
    class Logs < Command
      namespace :logs
      include Helpers

      before_hook :logged_in?, :only => [:latest, :get]
      class_option :cloud, :type => :string, :aliases => "-c", :desc => "Specify cloud"

      desc "latest", "Show latest application logs"
      method_option :limit, :type => :numeric, :aliases => "-n", :desc => "Amount of messages to show"
      method_option :from, :type => :string, :desc => "Time from which to find the logs"
      method_option :source, :type => :string, :aliases => "-s", :desc => "Limit logs to a single source, e.g. nginx"
      method_option :tail, :type => :boolean, :aliases => "-f", :desc => "Show new logs automatically"
      def latest
        app = multiple_clouds(options[:cloud], "logs latest")
        limit = options[:limit].to_i <= 0 ? 100 : options[:limit]
        query = {:limit => options[:limit], :source => options[:source]}
        query.merge!(:from => options[:from]) if options[:from]

        logs = app.application_logs(query)
        print_logs(logs)

        if options[:tail]
          app.application_logs_tail { |logs| print logs }
        end
      rescue Client::APIException => e
        raise e unless e.status_code == 416
        say_error "You have requested too many log messages. Try a lower number."
      end

      map "download" => :get
      desc "get [DATE]", "Download log file from a specific date"
      def get(date = "today")
        app = multiple_clouds(options[:cloud], "logs get #{date}")

        attributes = app.download_application_logs_attributes({:date => date})
        bar = Shelly::DownloadProgressBar.new
        app.download_application_logs(attributes, bar.progress_callback)
        bar.finish

        say_new_line
        say "Log file saved to #{attributes["filename"]}", :green
      rescue RestClient::ResourceNotFound => e
        say_error "Log file not found", :with_exit => false
      rescue Client::ValidationException => e
        e.each_error { |error| say_error error, :with_exit => false }
      end
    end
  end
end