'use client';

import { useCallback, useMemo } from 'react';
import { useAdminFilters } from '@/components/ui/domain/admin/AdminFilterBar/useAdminFilters';
import { nextSortState, type SortDir } from '@/lib/admin/table-sort';

export function useAdminTableState({ filterKeys }: { filterKeys: string[] }) {
  const allKeys = useMemo(
    () => [...new Set([...filterKeys, 'search', 'sortBy', 'sortDir'])],
    [filterKeys],
  );
  const { filters, setFilter, clearAll } = useAdminFilters(allKeys);

  const search = filters['search'] ?? '';
  const sortBy = filters['sortBy'] || null;
  const sortDir = (filters['sortDir'] as SortDir | undefined) || null;

  const setSort = useCallback(
    (columnKey: string) => {
      const next = nextSortState(sortBy, sortDir, columnKey);
      setFilter('sortBy', next.sortBy ?? '');
      setFilter('sortDir', next.sortDir ?? '');
    },
    [sortBy, sortDir, setFilter],
  );

  const clearSort = useCallback(() => {
    setFilter('sortBy', '');
    setFilter('sortDir', '');
  }, [setFilter]);

  const applySort = useCallback(
    (nextSortBy: string | null, nextSortDir: SortDir | null) => {
      setFilter('sortBy', nextSortBy ?? '');
      setFilter('sortDir', nextSortDir ?? '');
    },
    [setFilter],
  );

  const queryParams: Record<string, string> = useMemo(() => {
    const params: Record<string, string> = {};
    for (const key of filterKeys) {
      if (filters[key]) params[key] = filters[key]!;
    }
    if (search) params.search = search;
    if (sortBy) params.sortBy = sortBy;
    if (sortDir) params.sortDir = sortDir;
    return params;
  }, [filterKeys, filters, search, sortBy, sortDir]);

  return { search, sortBy, sortDir, setSort, clearSort, applySort, clearAll, queryParams };
}
