module IdCard
    class Setup < ApplicationRecord
        belongs_to :employer, class_name: 'Employer'
        belongs_to :network_logo, optional: true
        belongs_to :provider_section, optional: true
        belongs_to :rx_section, optional: true
        has_one :employer_logo, dependent: :destroy

        has_many :plans, dependent: :destroy
        has_many :field_exceptions, dependent: :destroy

        validates :print_name, :network_provider, :card_template, :employer_logo, :network_logo_id, 
                  :provider_section_id, :rx_section_id, presence: true, unless: :new_record?
        validates :pl_plan_key, :rx_group_number, presence: true, if: -> { initialized }
        validate :validate_print_name_fits_on_card

        attr_accessor :print_name_pixel_width

        accepts_nested_attributes_for :plans, allow_destroy: true, reject_if: :all_blank
        accepts_nested_attributes_for :field_exceptions, allow_destroy: true, reject_if: :all_blank

        attribute :queued_card_count, :integer, default: 0

        scope :active, -> { where(active: true) }

        FORM_COLORS = ['atmosphere', 'verdigris-vivid', 'cobalt-vivid', 'bluemana']
        MODULE_COLOR = 'atmosphere'

        before_save :active_initialized_check, if: :will_save_change_to_active?

        def active_initialized_check
            if active
                self.initialized = true
            end
        end

        def build_plan_with_default_benefits(attributes = {})
            plan = plans.new(attributes)
            benefits = IdCardBenefitsTemplate.find_by(title: "BLANK").id_card_benefits.sort_by(&:sequence)
            benefits.each do |ben|
                plan.plan_benefits.new(benefit_desc: ben.benefit_desc, sequence: ben.sequence)
            end
            plan
        end

        def has_field_exceptions?
            field_exceptions.present?
        end

        def sample_card_print_ready?
            print_name.present? && 
            card_template.present? &&
            employer_logo.present? &&
            network_logo_id.present? &&
            provider_section_id.present? &&
            rx_section_id.present? &&
            plans.present?
        end

        def member_cards_print_ready?
            sample_card_print_ready? &&
            plans.present? &&
            plans.all? { |plan| plan.pb_product_key.present? } &&
            employer.members.present?
        end

        def activation_ready?
            member_cards_print_ready? && !active
        end

        def field_exceptions_card_attributes_by_member_id(member_array = nil)
            unless member_array.present?
                member_array = self.employer.members.pluck(:pb_entity_key)
            end

            card_fes = self.field_exceptions.includes(:field_exception_items).in_order_of(:exception_type, IdCard::FieldException::VALID_TYPES)
            card_exceptions_map = {}
            card_fes.each do |fe|
                if fe.exception_type == "family_id"
                    matches = Member.where(pb_entity_key: member_array, family_id: fe.exception_values).pluck(:pb_entity_key)
                elsif fe.exception_type == "zipcode"
                    matches = Vhcs::PbEntityAddress.where(pb_entity_key: member_array, zip: fe.exception_values).pluck(:pb_entity_key)
                elsif fe.exception_type == "state"
                    matches = Vhcs::PbEntityAddress.where(pb_entity_key: member_array, state: fe.exception_values).pluck(:pb_entity_key)
                end
                if matches.present?
                    card_exceptions_map[fe.id] = fe.to_card_attrs
                    matches.each do |match|
                        unless card_exceptions_map[match].present?
                            card_exceptions_map[match] = fe.id
                        end
                    end
                end
            end

            card_exceptions_map
        end

        def self.permitted_params(params)
            params.require(:id_card_setup).permit(
                :print_name,
                :print_name_pixel_width,
                :network_provider,
                :card_template,
                :rx_group_number,
                :network_logo_id,
                :rx_section_id,
                :provider_section_id
            )
        end

        private

        def validate_print_name_fits_on_card
            if print_name_pixel_width.to_i > 100
                errors.add(:print_name, "Too Long For Card")
            end
        end
    end
end
