
class Family::FinancialAid::ApplicationsController < Family::Controller
  def show
    render_success :ok, json: props
  end

  def update
    if application.update(application_params)
      render_success :ok
    else
      render_error :unprocessable_entity, errors: application
    end
  end

  def credit_report
    if run_credit_report
      render_success :ok, json: application_contact.reload
    else
      render_error :unprocessable_entity
    end
  end

  private
    def financial_aid_config
      @financial_aid_config ||= current_school.find_or_build_financial_aid_config
    end

    def current_admission_year
      current_school.find_or_build_admission_config.school_year
    end

    def application
      @application ||= current_family.financial_aid_applications
        .find_or_initialize_by(school_year: current_admission_year)
    end

    def application_contact
      @application_contact ||= application.application_contacts
        .find_by(id: params[:application_contact_id])
    end

    def application_params
      params.permit(:status, contact_ids: [])
    end

    def waiver?
      current_family.financial_aid_waivers.find_by(school_year: current_admission_year).present?
    end

    def run_credit_report
      CreditReport::ExperianService.call(current_school, application_contact, params)
    end

    def props
      {
        id: application.id,
        school_year_id: application.school_year_id,
        status: application.status,
        waiver: financial_aid_config.school_voucher? && waiver?,
        contact_ids: application.application_contacts.pluck(:contact_id),
        contacts: application.application_contacts.map { |c| contact_props(c) }
      }
    end

    def contact_props(application_contact)
      contact = application_contact.contact
      {
        contact_id: contact.id,
        application_contact_id: application_contact.id,
        credit_report_key: application_contact.credit_report_key,
        full_name: contact.full_name,
        first_name: contact.first_name,
        last_name: contact.last_name,
        address: contact.address,
        address_ext: contact.address_ext,
        city: contact.city,
        state: contact.state,
        zip: contact.zip,
        date_of_birth: contact.date_of_birth
      }
    end
end
