require 'aws-sdk'

module ERDL
  class SNSAlert
    attr_accessor :subcommand, :success, :filename, :account, :location, :user, :host, :bucket, :user_sftp, :host_sftp

    def initialize(opts = {}, subcommand_opts = {}, subcommand = nil, success = false, filename = nil)
      @subcommand = subcommand
      @success = success
      @filename = filename
      @account = opts[:account]
      @location = subcommand_opts[:location]
      @user = ENV['FTP_USER']
      @host = ENV['FTP_HOST']
      @user_sftp = ENV['SFTP_USER']
      @host_sftp = ENV['SFTP_HOST']
      @bucket = subcommand_opts[:bucket]
    end

    def build_message(info = nil)
      info ||= if @success
                 "The following data file was uploaded to #{subcommand} successfully:"
               else
                 "There was an error while uploading the following data to #{subcommand}:"
               end
      destination ||= if @subcommand == 'ftp'
                        "User/Host: #{user}@#{host}"
                      elsif @subcommand == 's3'
                        "Bucket: #{bucket}"
                      elsif @subcommand == 'sftp'
                        "User/Host: #{user_sftp}@#{host_sftp}"
                      end
      <<-MSG
        #{info}

        Filename: #{filename}
        Account: #{account}
        Location: #{location}
        #{destination}
      MSG
    end

    def send_alert(topic = nil)
      subject = @success ? 'Report Upload Success' : 'ALERT: Report Upload Failure'
      message = build_message
      topic ||= Aws::SNS::Topic.new(ENV['AWS_SNS_TOPIC_ARN'])
      options = { subject: subject, message: message }
      topic.publish(options)
    end
  end
end
