class Admin::Legacy::Nursing::Students::VaccinesController < Admin::Legacy::Nursing::Controller
  def index
    render_success :ok, json: vaccines.map { |v| index_props(v) }
  end

  def show
    render_success :ok, json: vaccine_props(student_vaccine)
  end

  def create
    @student_vaccine = student_vaccines.build(vaccine_params)

    if student_vaccine.save
      render_success :ok, json: index_props(vaccine)
    else
      render_error :unprocessable_entity, errors: student_vaccine
    end
  end

  def update
    if student_vaccine.update(vaccine_params)
      render_success :ok, json: index_props(vaccine)
    else
      render_error :unprocessable_entity, errors: student_vaccine
    end
  end

  def destroy
    if student_vaccine.destroy
      render_success :ok, json: index_props(vaccine)
    else
      render_error :unprocessable_entity, errors: student_vaccine
    end
  end

  private
    def vaccines
      current_school.nursing_vaccine_configs.includes(:vaccine)
    end

    def vaccine
      @vaccine ||= vaccines.find_by(vaccine_id: student_vaccine.vaccine_id)
    end

    def student_vaccines
      @student_vaccines ||= student.nursing_vaccine_records
    end

    def student_vaccine
      @student_vaccine ||= student_vaccines.find_by(id: params[:id])
    end

    def student
      @student ||= current_school.students.find_by(id: params[:student_id])
    end

    def vaccine_params
      params.permit(:vaccine_id, :vaccine_date, :notes, :exempt)
    end

    def vaccine_props(student_vaccine)
      {
        id: student_vaccine.id,
        vaccine_date: student_vaccine.vaccine_date,
        recorded_date: student_vaccine.recorded_date,
        notes: student_vaccine.notes,
        exempt: student_vaccine.exempt
      }
    end

    def index_props(vaccine)
      item = student_vaccines.find { |s| s.vaccine_id == vaccine.vaccine_id }
      data = {
        vaccine_id: vaccine.vaccine_id,
        grade_level: grade_levels[vaccine.grade],
        grade_level_id: vaccine.grade,
        name: vaccine.decorate.name,
        student_name: student.full_name,
        date_of_birth: student.date_of_birth
      }
      return data if item.nil?

      data.merge(vaccine_props(item))
    end
end
