class Admin::Admissions::Applicants::CheckboxesController < Admin::Admissions::Controller
  include Admin::Admissions::ApplicantScoped

  def index
    render_success :ok, json: checkboxes.positioned.map { |c| checkbox_props(c) }
  end

  def show
    render_success :ok, json: checkbox_props(checkbox)
  end

  def update
    applicant_checkbox = applicant_checkboxes.find_or_initialize_by(checkbox: checkbox)

    if applicant_checkbox.update(applicant_checkbox_params)
      render_success :ok, json: checkbox_props(checkbox)
    else
      render_error :unprocessable_entity, errors: applicant_checkbox
    end
  end

  private
    def checkboxes
      applicant.application.checkboxes
    end

    def applicant_checkboxes
      applicant.applicant_checkboxes.includes(:user)
    end

    def checkbox
      @checkbox ||= checkboxes.find_by(id: params[:id])
    end

    def checkbox_values
      @checkbox_values ||= applicant_checkboxes.index_by(&:checkbox_id)
    end

    def applicant_checkbox_params
      params.permit(:checked, :checked_at, :feedback).merge(user: current_user)
    end

    def checkbox_props(checkbox)
      applicant_checkbox = checkbox_values[checkbox.id]

      {
        id: checkbox.id,
        name: checkbox.name,
        checked: applicant_checkbox&.checked || false,
        checked_at: applicant_checkbox&.checked_at,
        feedback: applicant_checkbox&.feedback,
        user_id: applicant_checkbox&.user_id,
        user_name: applicant_checkbox&.user&.full_name
      }
    end
end
