class Family::Legacy::ContactsController < Family::Controller
  before_action :validate_school_allows_changes, only: :update

  def index
    data = contacts
      .primary(params[:primary]&.to_bool)
      .by_primary_email_address(params[:primary_email])
    render_success :ok, json: data.map { |c| contact_props(c) }
  end

  def show
    render_success :ok, json: contact_props(contact)
  end

  def update
    if contact.update(contact_params)
      render_success :ok, json: contact_props(contact)
    else
      render_error :unprocessable_entity, errors: contact
    end
  end

  private
    def contacts
      current_family.contacts
    end

    def contact
      @contact ||= contacts.find_by(id: params[:id])
    end

    def contact_families_by_contact
      @contact_families_by_contact ||= current_family.contact_families.index_by(&:contact_id)
    end

    def contact_params
      params.permit(
        :first_name,
        :last_name,
        :address,
        :address_ext,
        :city,
        :state,
        :zip,
        :country_id,
        :home_phone,
        :work_phone,
        :cell_phone,
        :email,
        :email2,
        contact_families_attributes: [
          :id,
          :relationship_id,
          :pickup,
          :emergency
        ]
      )
    end

    def contact_props(contact)
      {}.tap do |props|
        props[:id] = contact.id
        props[:full_name] = contact.full_name(:reverse)
        props[:first_name] = contact.first_name
        props[:last_name] = contact.last_name
        props[:address] = contact.address
        props[:address_ext] = contact.address_ext
        props[:city] = contact.city
        props[:state] = contact.state
        props[:zip] = contact.zip
        props[:country_id] = contact.country_id? ? contact.country_id : nil
        props[:work_phone] = contact.work_phone
        props[:home_phone] = contact.home_phone
        props[:cell_phone] = contact.cell_phone
        props[:email] = contact.email
        props[:email2] = contact.email2
        props[:contact_families_attributes] = contact_family_props(contact)
        return props if action_name.to_sym == :index

        props[:primary_email] = contact.primary_email_address
      end
    end

    def contact_family_props(contact)
      contact_family = contact_families_by_contact[contact.id]

      {}.tap do |props|
        props[:id] = contact_family.id
        props[:relationship_id] =
          contact_family.relationship_id? ? contact_family.relationship_id : nil
        props[:relationship_name] = contact_family.decorate.relationship_name
        props[:primary] = contact_family.primary
        props[:emergency] = contact_family.emergency
        props[:pickup] = contact_family.pickup
      end
    end
end
