require 'urbanairship'
require 'json'

module Urbanairship
  module Devices
    class EmailNotification
      include Urbanairship::Common
      include Urbanairship::Loggable
      attr_accessor :bcc,
                    :bypass_opt_in_level,
                    :html_body,
                    :message_type,
                    :plaintext_body,
                    :reply_to,
                    :sender_address,
                    :sender_name,
                    :subject,
                    :template_id,
                    :variable_details,
                    :click_tracking,
                    :open_tracking

      def initialize(client: required('client'))
        @client = client
      end

      def email_override
        fail ArgumentError, 'message_type is needed for email override' if @message_type.nil?
        fail ArgumentError, 'plaintext_body is needed for email override' if @plaintext_body.nil?
        fail ArgumentError, 'reply_to is needed for email override' if @reply_to.nil?
        fail ArgumentError, 'sender_address is needed for email override' if @sender_address.nil?
        fail ArgumentError, 'sender_name is needed for email override' if @sender_name.nil?
        fail ArgumentError, 'subject is needed for email override' if @subject.nil?

        override = {
          bcc: bcc,
          bypass_opt_in_level: bypass_opt_in_level,
          click_tracking: click_tracking,
          html_body: html_body,
          message_type: message_type,
          open_tracking: open_tracking, 
          plaintext_body: plaintext_body,
          reply_to: reply_to,
          sender_address: sender_address,
          sender_name: sender_name,
          subject: subject
        }.delete_if {|key, value| value.nil?} #this removes the nil key value pairs

        {'email': override}
      end

      def email_with_inline_template
        fail ArgumentError, 'message_type is needed for email with inline template' if @message_type.nil?
        fail ArgumentError, 'reply_to is needed for email with inline template' if @reply_to.nil?
        fail ArgumentError, 'sender_address is needed for email with inline template' if @sender_address.nil?
        fail ArgumentError, 'sender_name is needed for email with inline template' if @sender_name.nil?

        inline_template = {
          bcc: bcc,
          click_tracking: click_tracking,
          message_type: message_type,
          open_tracking: open_tracking,
          reply_to: reply_to,
          sender_address: sender_address,
          sender_name: sender_name,
          template: define_template_object
        }.delete_if {|key, value| value.nil?} #this removes the nil key value pairs      

        {'email': inline_template}
      end

      def define_template_object
        fail ArgumentError, 'Must choose between template_id or fields object' if template_id && plaintext_body && subject
        template_portion = {
          template_id: template_id,
          fields: define_fields,
          variable_details: variable_details
        }.delete_if {|key, value| value.nil?}
      end

      def define_fields
        if subject && plaintext_body
          {
            subject: subject,
            plaintext_body: plaintext_body
          }
        end
      end

    end
  end
end