require 'rcs-common/trace'

require_release 'rcs-db/config'
require_release 'rcs-db/alert'

module RCS
  module Monitor
    class Mailer
      include RCS::Tracer

      def initialize
        @cached_rcpts = []
      end

      def alert(subject, message, html: nil, binding: nil, short_message: nil)
        if short_messages? and short_message
          html = false
          message = short_message
        elsif binding
          html = true
          message = render_template(message, binding)
        end

        alert!(subject, message, html: html)
      end

      def alert!(subject, message, options = {})
        if alert_users.empty?
          trace(:warn, "Ensure that at least one user in the ALERT group has a valid email")
          return
        end

        alert_users.each do |rcpt|
          result = RCS::DB::Alerting.__send__(:send_mail, rcpt, subject, message, options)
          return false unless result
        end
      end

      def alert_group
        ::Group.where(alert: true).first
      end

      def alert_users
        group = alert_group
        @cached_rcpts = group ? group.users.map(&:contact).select { |email| !email.to_s.empty? } : []
      rescue Moped::Errors::ConnectionFailure, Moped::Errors::QueryFailure
        @cached_rcpts
      end

      def render_template(template, binding)
        template = ERB.new(File.new("#{__dir__}/#{template}.erb").read, nil, "%")
        template.result(binding)
      end

      def short_messages?
        RCS::DB::Config.instance.global['SHORT_EMAIL']
      end
    end
  end
end
