class Family::Admissions::Applicants::FamilyContactsController < Family::Admissions::Controller
  include Family::Admissions::ApplicantScoped

  def show
    render_success :ok, json: revision_props
  end

  def new
    @revision = revisions.build(contact_family: contact_family)
    render_success :ok, json: revision_props
  end

  def create
    revision = revisions.build(revision_params)

    if revision.save
      render_success :ok
    else
      render_error :unprocessable_entity, errors: revision
    end
  end

  def update
    if revision.update(revision_params)
      render_success :ok
    else
      render_error :unprocessable_entity, errors: revision
    end
  end

  def destroy
    if revision.destroy
      render_success :ok
    else
      render_error :unprocessable_entity, errors: revision
    end
  end

  private
    def revisions
      current_family.admission_contact_revisions
    end

    def revision
      @revision ||= revisions.find_by(id: params[:id])
    end

    def contact_family
      @contact_family ||= current_family.contact_families.find_by(id: params[:contact_family_id])
    end

    def contact_fields
      @contact_fields ||= current_school.admission_contact_revision_fields
        .with_display
        .where(field: Admission::ContactRevisionField::DISPLAY_FIELDS[0...-1])
        .map { |f| { name: f.field, required: f.required } }
    end

    def association
      { school_year: current_school.admission_config.school_year }
    end

    def revision_params
      params.permit(Admission::ContactRevision::ALL_ATTRIBUTES).merge(association)
    end

    def revision_props
      {}.tap do |props|
        props[:id] = revision.id
        props[:first_name] = revision.first_name
        props[:last_name] = revision.last_name
        props[:relationship_id] = revision.relationship_id
        props[:primary] = revision.primary
        props[:emergency] = revision.emergency
        props[:pickup] = revision.pickup
        props[:fields] = contact_fields
        props[:country_id] = revision.country_id

        contact_fields.each do |field|
          field = field[:name].to_sym == :zip_code ? :zip : field[:name].to_sym
          props[field] = revision[field]
        end
      end
    end
end
