import { FilterQueryParams, Id, Uuid } from '@win2win/shared';
import { useFetch } from '@win2win/shared-ui';
import { merge } from 'lodash';
import { computed, ComputedRef, Ref } from 'vue';
import { DynamicTableViewsRefs } from '../../models';
import { useContextParams } from './useContextParams';
import { useSelectRows } from './useSelectRows';

export function useBatchActions(refs: ComputedRef<DynamicTableViewsRefs>, filters: Ref<FilterQueryParams>) {
  const { isVisible } = useContextParams();
  const batchActions = computed(() => [
    ...(refs.value.layout?.batchActions?.filter((action) => isVisible(action.visibility)) || []),
    ...(refs.value.customConfig?.batchActions?.filter((action) => isVisible(action.visibility)) || []),
  ]);
  const selectable = computed(() => !!batchActions.value.length);
  const endpoint = computed(() => refs.value.endpoint);
  const queryKey = computed(() => [endpoint.value, filters]);
  const idKey = computed(() => refs.value.idKey);
  const params = computed(() => merge({}, filters.value, { custom: { allIds: true, idKey: idKey.value } }));

  const { data: allIds, fetching: fetchingAllIds } = useFetch<(Id | Uuid)[]>(queryKey, endpoint, params, (data) => data?.items || [], { enabled: () => selectable.value });
  const { selected, selectedIds, allSelected, toggleAllSelected } = useSelectRows(allIds as Ref<(Id | Uuid)[]>, idKey);

  return {
    selected,
    selectedIds,
    selectable,
    allSelected,
    toggleAllSelected,
    fetchingAllIds,
    batchActions,
  };
}
