module IdCard
  class Plan < ApplicationRecord
    belongs_to :setup, optional: true
    has_many :plan_benefits, dependent: :destroy
    accepts_nested_attributes_for :plan_benefits, allow_destroy: true, reject_if: :all_blank

    validates :title, presence: true
    validates :pb_product_key, :pl_plan_key, presence: true, if: -> { setup&.active }
    validates :pb_product_key, uniqueness: true, allow_nil: true
    validate :validate_plan_benefits_count, unless: -> { template }

    scope :templates, -> { where(template: true) }

    FARIOS_BENEFIT_FIELDS = ["Primary Visit", "Specialist Visit", "Urgent Care", "INN-Ind Ded", "INN-Family Ded", "OON-Ind Ded", "OON-Family Ded", "Co-Insurance", "INN-Ind OOP", "INN-Family OOP", "OON-Ind OOP", "OON-Family OOP", "Emergency Room", "Preventive Care"].freeze
    TANDEMLOC_BENEFIT_FIELDS = ["Physician Visit", "Specialist Visit", "Urgent Care", "Deductible", "Co-Insurance", "Out-of-Pocket", "Emergency Room", "Preventive Care"].freeze
    SMART_BENEFIT_FIELDS = [].freeze

    after_initialize :build_plan_benefits, if: :new_record?

    def build_plan_benefits
      if plan_benefits.empty?
        plan_benefit_fields = case setup&.card_template
                              when "TandemlocIDCard"
                                TANDEMLOC_BENEFIT_FIELDS
                              when "SmartIDCard"
                                SMART_BENEFIT_FIELDS
                              else
                                FARIOS_BENEFIT_FIELDS
                              end
        plan_benefit_fields.each_with_index do |bene, i|
          self.plan_benefits.build(benefit_desc: bene, sequence: (i + 1))
        end
      end
    end

    def format_template
      formatted_title = title
      if pl_plan_key.present?
        employer_name = Employer.find_by(pl_plan_key: pl_plan_key).pluck(:name)
        formatted_title.concat( " (#{employer_name})" )
      end
      { id: id, title: formatted_title }
    end

    class << self

      def permitted_params(params)
            params.require(:id_card_setup).permit(
              plans_attributes: [
                :id,
                :title,
                :pb_product_key,
                :pl_plan_key,
                :_destroy,
                plan_benefits_attributes: [
                  :id,
                  :benefit_desc,
                  :benefit,
                  :sequence,
                  :_destroy,
                ]
              ] 
            )
      end

    end

    private

    def validate_plan_benefits_count
      plan_benefits_size = plan_benefits.size
      template_benefits_size = case setup&.card_template
                                when "TandemlocIDCard"
                                  TANDEMLOC_BENEFIT_FIELDS.size
                                when "SmartIDCard"
                                  SMART_BENEFIT_FIELDS.size
                                else
                                  FARIOS_BENEFIT_FIELDS.size
                                end
      unless plan_benefits_size == template_benefits_size
        errors.add(:base, "Plan Benefits size (#{plan_benefits_size}) does not match ID Card Template (#{template_benefits_size})")
      end
    end

  end
end