class Admin::Legacy::Family::AdditionalFieldsController < Admin::Controller
  def index
    data = fields.by_group(params[:group_id]).ordered.map { |f| field_props(f) }
    render_success :ok, json: data
  end

  def show
    render_success :ok, json: field_props(field)
  end

  def create
    field = fields.build(field_params)
    if field.save
      render_success :ok, json: field_props(field)
    else
      render_error :unprocessable_entity, errors: field
    end
  end

  def update
    if field.update(field_params)
      render_success :ok, json: field_props(field)
    else
      render_error :unprocessable_entity, errors: field
    end
  end

  def destroy
    if field.destroy
      render_success :ok
    else
      render_error :unprocessable_entity, errors: field
    end
  end

  def destroy_additional_values
    if field.destroy_attached_values
      render_success :ok, message: 'Field data cleared.'
    else
      render_error :unprocessable_entity
    end
  end

  private
    def fields
      current_school.family_additional_fields
    end

    def field
      @field ||= fields.find_by(id: params[:id])
    end

    def field_params
      params.permit(
        :name,
        :description,
        :type,
        :public,
        :validation_type,
        :validation_pattern,
        :required,
        :sequence,
        :admissions,
        :inquiries,
        family_additional_choices: [:id, :label, :value, :sequence, :_destroy]
      ).merge(set_group)
    end

    def group
      @group ||= current_school.family_additional_groups
        .find_by(id: params[:family_additional_group_id])
    end

    def set_group
      {}.tap do |props|
        props[:family_additional_group] = group if params.key?(:family_additional_group_id)
      end
    end

    def field_props(field)
      {}.tap do |prop|
        prop[:id] = field.id
        prop[:name] = field.name
        prop[:description] = field.description
        prop[:type] = field.type
        prop[:public] = field.public?
        prop[:validation_type] = field.validation_type
        prop[:validation_pattern] = field.validation_pattern
        prop[:required] = field.required
        prop[:admissions] = field.admissions?
        prop[:sequence] = field.sequence
        prop[:family_additional_group_id] = field.family_additional_group_id
        return prop if action_name.to_sym == :index

        prop[:family_additional_choices] = field.family_additional_choices
          .ordered
          .map { |c| choice_props(c) }
        prop[:families_with_values] = field.families_with_values
      end
    end

    def choice_props(choice)
      {
        id: choice.id,
        label: choice.label,
        value: choice.value,
        sequence: choice.sequence
      }
    end
end
