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

  def index
    render_success :ok, json: essays.map { |e| essay_props(e) }
  end

  def show
    render_success :ok, json: essay_props(essay)
  end

  def update
    if applicant_essay.update(essay_params)
      render_success :ok, json: essay_props(essay)
    else
      render_error :unprocessable_entity, errors: applicant_essay
    end
  end

  private
    def essays
      @essays ||= applicant.application.essays.positioned
    end

    def applicant_essay
      @applicant_essay ||= applicant.applicant_essays.find_or_initialize_by(essay: essay)
    end

    def essay
      @essay ||= application_essay.essay
    end

    def application_essay
      @application_essay ||= applicant.application.application_essays
        .find_by(essay_id: params[:essay_id])
    end

    def application_essays
      @application_essays ||= applicant.application_essays.index_by(&:essay_id)
    end

    def applicant_essays
      @applicant_essays ||= applicant.applicant_essays.index_by(&:essay_id)
    end

    def essay_params
      params.permit(:body)
    end

    def essay_props(essay)
      {
        id: essay.id,
        name: essay.name,
        body: essay.body,
        required: application_essays[essay.id]&.required,
        response: applicant_essays[essay.id]&.body,
        word_count: applicant_essays[essay.id]&.decorate&.word_count || 0
      }
    end
end
