import { useState, useCallback } from "react";

// ── Types ────────────────────────────────────────────────────
export interface PaginationParams {
  page: number;
  limit: number;
  search?: string;
  sortBy?: string;
  sortOrder?: "asc" | "desc";
  status?: string;
  role?: string;
  priority?: string;
}

export interface PaginationMeta {
  page: number;
  limit: number;
  total: number;
  totalPages: number;
}

export interface PaginatedResponse<T> {
  data: T[];
  pagination: PaginationMeta;
}

// ── Hook ─────────────────────────────────────────────────────
export const usePagination = (initialLimit: number = 10) => {
  const [pagination, setPagination] = useState<PaginationParams>({
    page: 1,
    limit: initialLimit,
    search: "",
    sortBy: "",
    sortOrder: "desc",
  });

  const setPage = useCallback(
    (page: number) => setPagination((prev) => ({ ...prev, page })),
    []
  );

  const setLimit = useCallback(
    (limit: number) => setPagination((prev) => ({ ...prev, page: 1, limit })),
    []
  );

  const setSearch = useCallback(
    (search: string) => setPagination((prev) => ({ ...prev, page: 1, search })),
    []
  );

  const setSort = useCallback(
    (sortBy: string, sortOrder: "asc" | "desc" = "asc") =>
      setPagination((prev) => ({ ...prev, page: 1, sortBy, sortOrder })),
    []
  );

  const resetPagination = useCallback(
    () =>
      setPagination({
        page: 1,
        limit: initialLimit,
        search: "",
        sortBy: "",
        sortOrder: "desc",
      }),
    [initialLimit]
  );

  return {
    pagination,
    setPage,
    setLimit,
    setSearch,
    setSort,
    resetPagination,
  };
};

// ── Query params builder ─────────────────────────────────────
export const buildQueryParams = (params: PaginationParams & Record<string, any>): string => {
  const searchParams = new URLSearchParams();
  searchParams.set("page", String(params.page));
  searchParams.set("limit", String(params.limit));
  if (params.search && params.search.trim().length >= 3) searchParams.set("search", params.search.trim());
  if (params.sortBy && params.sortBy.trim()) {
    searchParams.set("sortBy", params.sortBy);
    if (params.sortOrder) searchParams.set("sortOrder", params.sortOrder);
  }
  if (params.status && params.status !== "ALL") searchParams.set("status", params.status);
  if (params.role && params.role !== "ALL") searchParams.set("role", params.role);
  if (params.priority && params.priority !== "ALL") searchParams.set("priority", params.priority);
  if (params.category && params.category !== "ALL") searchParams.set("category", params.category);
  return searchParams.toString();
};
