class Admin::Legacy::Student::AdditionalValuesController < Admin::Legacy::Student::Controller
  def index
    render_success :ok, json: students.by_id(params[:ids]).ordered.map { |s| props(s) }
  end

  def batch_update
    params[:values].each do |value|
      value[:SchoolID] = current_school.id
    end

    if current_school.student_additional_values.upsert_all(params[:values])
      render_success :ok, message: 'Additional Fields updated.'
    else
      render_error :unprocessable_entity
    end
  end

  def fields
    render_success :ok, json: additional_fields.map { |f| field_props(f) }
  end

  private
    def students
      current_school.students.includes(:student_additional_values)
    end

    def additional_fields
      @additional_fields ||= current_school.student_additional_fields
        .includes(:choices)
        .order(:name)
    end

    def props(student)
      {}.tap do |prop|
        prop[:student_id] = student.id
        prop[:full_name] = student.full_name(:reverse)

        values = student.student_additional_values.index_by(&:student_additional_field_id)

        additional_fields.each do |field|
          prop[field.id] = {
            student_additional_field_id: field.id,
            value: values[field.id]&.value,
            value_date: values[field.id]&.value_date,
            type: field.type
          }
        end
      end
    end

    def field_props(field)
      choices = field.choices
        .map { |c| { id: c.value, name: c.name, order: c.order } }
        .sort_by { |c| c[:order] }

      {
        id: field.id,
        name: field.name,
        type: field.type,
        choices: choices
      }
    end
end
