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

  def index
    render_success :ok, json: documents.positioned.map { |d| document_props(d) }
  end

  def update
    if applicant_document.update(document_params)
      render_success :ok, json: document_props(document)
    else
      render_error :unprocessable_entity, errors: applicant_document
    end
  end

  def destroy
    if applicant_document.destroy
      render_success :ok, json: document_props(document)
    else
      render_error :unprocessable_entity, errors: applicant_document
    end
  end

  private
    def documents
      applicant.application.documents
    end

    def applicant_documents
      applicant.applicant_documents
    end

    def document
      @document ||= documents.find_by(id: params[:id])
    end

    def applicant_document
      @applicant_document ||= applicant_documents.find_or_initialize_by(document: document)
    end

    def document_values
      @document_values ||= applicant_documents.map { |d| [d.document_id, d.file] }.to_h
    end

    def document_params
      params.permit(:file)
    end

    def document_props(document)
      file = document_values[document.id]

      {
        id: document.id,
        name: document.name,
        filename: file&.attachment&.filename,
        url: file&.attachment&.service_url
      }
    end
end
