class Employee::AddressBook::CompanyAdditionalFieldsController < Employee::Controller
  def index
    render_success :ok, json: fields.ordered.map { |c| field_props(c) }
  end

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

  def create
    field = fields.build(field_params)
    if field.save
      render_success :created, 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

  private
    def fields
      current_school.company_additional_fields
    end

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

    def field_params
      params.permit(
        :name,
        :description,
        :group_id,
        :type,
        :position,
        choices_attributes: [:id, :name, :value, :order, :_destroy]
      )
    end

    def field_props(item)
      {}.tap do |prop|
        prop[:id] = item.id
        prop[:name] = item.name
        prop[:description] = item.description
        prop[:group_id] = item.group_id
        prop[:type] = item.type
        return prop if action_name.to_sym == :index

        prop[:choices_attributes] = item.choices.map { |c| choice_props(c) }
      end
    end

    def choice_props(choice)
      {
        id: choice.id,
        name: choice.name,
        value: choice.value,
        order: choice.order
      }
    end
end
