require 'optparse'
require 'colorize'
require_relative 'monitor'

module RCS
  module Monitor
    module CLI
      extend self

      def run(argv)
        @opts = {};

        argv.delete("--cli")
        argv << '--help' if argv.empty?

        OptionParser.new do |opts|
          opts.on('-v', '--verbose', 'verbose') {
            @opts[:verbose] = true
          }

          opts.on('-d', '--doctor', 'Check for configuration errors') {
            @opts[:doctor] = true
          }

          opts.on('-s', '--show-cfg', 'Show current smtp configuration') {
            @opts[:show_cfg] = true
          }
        end.parse(argv)

        return show_cfg if @opts[:show_cfg]
        return doctor if @opts[:doctor]
      end

      def verbose?
        @opts[:verbose]
      end

      def trace(level, message)
        if (level == :debug and verbose?) or level != :debug
          puts "#{Time.now} [#{level.to_s.upcase}]: #{message}"
        end
      end

      def smtp_parameters
        %w[CN SMTP SMTP_FROM SMTP_USER SMTP_PASS SMTP_AUTH SHORT_EMAIL]
      end

      def show_cfg
        Application.new.setup

        puts "Current configuration for smtp:"

        smtp_parameters.each do |name|
          value = RCS::DB::Config.instance.global[name]
          value = "#"*10 if value and name =~ /pass/i
          puts "#{name}: #{value}"
        end
      end

      def doctor_error(message)
        fixmsg = "Fix this issue".colorize(:red)
        trace :error, "#{fixmsg}: #{message}"
      end

      def doctor
        Application.new.setup

        mailer = Mailer.new

        unless mailer.alert_group
          return doctor_error "unable to find an alerting group"
        end

        if mailer.alert_users.empty?
          return doctor_error "it must be at least one user in the ALERT group has a valid email"
        end

        trace :debug, "Sending test email to the following addresses: #{mailer.alert_users.join(', ')}"

        if mailer.alert("RCS Test email", "This is a test email. Do not reply.")
          trace :info, "A test email was sent to #{mailer.alert_users.join(', ')}. Please verify that you received it correctly."
        else
          doctor_error "there was an error while sending the test email"
        end

        trace :debug, "Diagnosis completed"
      end

    end
  end
end
