class Admin::Admissions::Families::AdditionalFieldsController < Admin::Admissions::Controller
  include Admin::Admissions::FamilyScoped

  def show
    values = additional_values.includes(:family_additional_field)
    render_success :ok, json: values.map { |v| additional_value_props(v) }
  end

  def update
    unless family.admission_editable?
      return render_error :unprocessable_entity, message: 'Update has already been applied'
    end

    values = []

    additional_fields.each do |field|
      additional_value = additional_values.find_or_initialize_by(family_additional_field: field)
      value = params[field.id.to_s][:value]&.strip || ''
      additional_value.value = field.date? && value.to_date ? I18n.l(value.to_date) : value
      values << additional_value
    end

    if transactional_save(values)
      render_success :ok, object: 'additional_fields'
    else
      render_error :unprocessable_entity, message: 'Something went wrong'
    end
  end

  private
    def additional_values
      family.admission_family_additional_values.by_school_year(school_year).build_all(family)
    end

    def additional_fields
      current_school.family_additional_fields.by_admission
    end

    def additional_value_props(additional_value)
      field = additional_value.family_additional_field
      {}.tap do |props|
        props[:additional_field_id] = additional_value.family_additional_field_id
        props[:value] = additional_value.value
      end
    end
end
