class Admin::Legacy::HumanResources::AdditionalGroupsController <
    Admin::Legacy::HumanResources::Controller
  include CacheHelper

  def index
    data = load_cache("school/#{current_school.id}/employee_additional_groups") do
      groups.includes(:fields).ordered.map { |g| group_props(g) }.to_json
    end
    render_success :ok, json: data
  end

  def show
    render_success :ok, json: group_props(group)
  end

  def create
    group = groups.build(group_params)
    if group.save
      render_success :ok, object: 'Additional Field Group', json: group_props(group)
    else
      render_error :unprocessable_entity, errors: group
    end
  end

  def update
    if group.update(group_params)
      render_success :ok, object: 'Additional Field Group', json: group_props(group)
    else
      render_error :unprocessable_entity, errors: group
    end
  end

  def destroy
    if group.destroy
      render_success :ok, object: 'Additional Field Group'
    else
      render_error :unprocessable_entity, errors: group
    end
  end

  def order
    group_ids = params[:items].map { |i| i['id'] }
    items = groups.where(id: group_ids) do |group|
      item = params[:items].find { |i| group.id == i['id'] }
      group.order = item['order']
      group
    end

    if transactional_save(items)
      render_success :ok, message: 'Order Updated.'
    else
      render_error :unprocessable_entity, message: 'Something went wrong.'
    end
  end

  private
    def groups
      current_school.employee_additional_groups
    end

    def group
      @group ||= groups.find_by(id: params[:id])
    end

    def group_params
      params.permit(:name, :description, :order)
    end

    def group_props(group)
      {}.tap do |prop|
        prop[:id] = group.id
        prop[:name] = group.name
        prop[:description] = group.description
        prop[:order] = group.order
        prop[:count] = group.fields.count
      end
    end
end
