require 'net/ftp'
require 'open-uri'
require 'net/sftp'
require 'raven'
require 'mechanize'

module ERDL
  class Executable
    def initialize(opts, subcommand, subcommand_opts, opt_params = {})
      @opts = opts
      @subcommand = subcommand
      @subcommand_opts = subcommand_opts
      @fetcher = opt_params[:fetcher]
      @alert = opt_params[:alert]
      @file_utils = opt_params[:file_utils]
      @fetcher ||= ERDL::URLFetcher.new(@opts)
      @alert ||= ERDL::SNSAlert.new(@opts, @subcommand_opts, @subcommand) if @opts[:alert]
      @file_utils ||= ERDL::FileUtilities.new(@opts, @subcommand, @subcommand_opts, @alert)
    end

    def execute!
      url = @fetcher.url
      fail 'Something went wrong, could not get a URL!' unless url
      if @opts[:dry_run]
        return Base.log_action(__FILE__, "Dry run, not uploading to FTP! URL: #{url}")
      end
      stream_success = @file_utils.stream_file(url)
      return unless @alert && stream_success
      @alert.success = true
      @alert.send_alert
    end

    def print_error(e)
      @full_info = e.message << "\n" << e.backtrace.join("\n")
      message = @opts[:trace] ? full_info : e.message
      Base.log_action(__FILE__, "#{message}")
    end

    def call_alert
      return unless @alert
      @alert.build_message(@full_info)
      @alert.send_alert
    end
  end
end
