class Admin::Admissions::Families::ContactRevisionsController < Admin::Admissions::Controller
  include Admin::Admissions::FamilyScoped

  def index
    render_success :ok, json: contact_service.props
  end

  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.new

    if revision.update(revision_params)
      render_success :ok, json: contact_service.props
    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

  private
    def contact_service
      Admission::Applicants::FamilyContactService.new(nil, nil, family, school_year)
    end

    def revisions
      family.admission_contact_revisions
    end

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

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

    def revision_params
      params
        .permit(Admission::ContactRevision::ALL_ATTRIBUTES)
        .merge(school_year: school_year, skip_validation: true)
    end

    def revision_props
      {}.tap do |props|
        props[:id] = revision.id
        props[:contact_family_id] = revision.contact_family_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[:title_id] = revision.title_id
        props[:address] = revision.address
        props[:address_ext] = revision.address_ext
        props[:city] = revision.city
        props[:state] = revision.state
        props[:zip] = revision.zip
        props[:work_phone] = revision.work_phone
        props[:home_phone] = revision.home_phone
        props[:cell_phone] = revision.cell_phone
        props[:email] = revision.email
        props[:country_id] = revision.country_id
        return props if action_name.to_sym == :index

        props[:current_contact] = {
          first_name: revision.contact&.first_name,
          last_name: revision.contact&.last_name,
          relationship: revision.contact_family&.relationship&.name,
          primary: revision.contact_family&.primary?,
          emergency: revision.contact_family&.emergency?,
          pickup: revision.contact_family&.pickup?,
          title: revision.contact&.title&.name,
          address: revision.contact&.address,
          address_ext: revision.contact&.address_ext,
          city: revision.contact&.city,
          state: revision.contact&.state,
          zip: revision.contact&.zip,
          country_id: revision.contact&.country_id,
          work_phone: revision.contact&.work_phone,
          cell_phone: revision.contact&.cell_phone,
          home_phone: revision.contact&.home_phone,
          email: revision.contact&.email
        }
      end
    end
end
