#Copyright (c) 2008-12 Peter H. Boling of 9thBit LLC
#Released under the MIT license
module SanitizeEmail
  module Sanitizer
    def self.included(base)
      base.extend SanitizeEmail::Sanitizer::ClassMethods
    end

    module ClassMethods

      def subject_override(real_subject, actual_addresses)
        if actual_addresses.nil? || !SanitizeEmail.use_actual_email_prepended_to_subject
          real_subject
        else
          "(#{actual_addresses.join(',').gsub(/@/,' at ').gsub(/[<>]/,'~')}) #{real_subject}"
        end
      end

      def recipients_override(actual_addresses)
        override_email(:recipients, actual_addresses)
      end

      def cc_override(actual_addresses)
        override_email(:cc, actual_addresses)
      end

      def bcc_override(actual_addresses)
        override_email(:bcc, actual_addresses)
      end

      #######
      private
      #######

      def override_email(type, actual_addresses)
        real_addresses, sanitized_addresses = case type
          when :recipients
            [actual_addresses, SanitizeEmail.sanitized_recipients]
          when :cc
            [actual_addresses, SanitizeEmail.sanitized_cc]
          when :bcc
            [actual_addresses, SanitizeEmail.sanitized_bcc]
          else raise "sanitize_email error: unknown email override"
        end
        # Normalize to an array
        real_addresses = [real_addresses] unless real_addresses.is_a?(Array)
        # Normalize to an array
        sanitized_addresses = [sanitized_addresses] unless sanitized_addresses.is_a?(Array)

        # If there were no original recipients, then we DO NOT override the nil with the sanitized recipients
        return nil if real_addresses.blank?
        # If there are no sanitized addresses we can't override!
        return nil if sanitized_addresses.blank?
        # If we don't want to inject the actual email in the 'user name' section of the sanitized recipients,
        # then just return the default sanitized recipients
        return sanitized_addresses unless SanitizeEmail.use_actual_email_as_sanitized_user_name

        out = real_addresses.inject([]) do |result, real_recipient|
          if real_recipient.nil?
            new_recipient = sanitized_addresses
          else
            new_recipient = sanitized_addresses.map{|sanitized| "#{real_recipient.gsub(/@/,' at ').gsub(/[<>]/,'~')} <#{sanitized}>"}
          end
          result << new_recipient
          result
        end.flatten
        return out
      end

    end

  end
end