"use client";

import { useEffect, useMemo, useState } from "react";
import { usePathname } from "next/navigation";

const getModuleFromPath = (pathname: string) =>
  pathname.split("/").filter(Boolean)[0] || "root";

const ACTIVE_MODULE_KEY = "__active_pagination_module__";


export const useApiPagination = (
  defaultPage: number = 1,
  defaultPerPage: number = 10,
) => {
  const pathname = usePathname();
  const module = getModuleFromPath(pathname);
  const storageKey = `pagination:${module}`;

 
  const initialState = useMemo(() => {
    if (typeof window === "undefined") {
      return {
        page: defaultPage,
        perPage: defaultPerPage,
      };
    }

    const activeModule = sessionStorage.getItem(ACTIVE_MODULE_KEY);

    if (activeModule && activeModule !== module) {
      sessionStorage.removeItem(`pagination:${activeModule}`);
    }

    sessionStorage.setItem(ACTIVE_MODULE_KEY, module);

    const saved = sessionStorage.getItem(storageKey);

    if (saved) {
      try {
        const parsed = JSON.parse(saved);
        return {
          page:
            typeof parsed.currentPage === "number"
              ? parsed.currentPage
              : defaultPage,
          perPage:
            typeof parsed.recordsPerPage === "number"
              ? parsed.recordsPerPage
              : defaultPerPage,
        };
      } catch {
        sessionStorage.removeItem(storageKey);
      }
    }

    return {
      page: defaultPage,
      perPage: defaultPerPage,
    };
  }, [module, storageKey, defaultPage, defaultPerPage]);


  const [currentPage, setCurrentPage] = useState<number>(initialState.page);
  const [recordsPerPage, setRecordsPerPage] = useState<number>(
    initialState.perPage,
  );

 
  useEffect(() => {
    sessionStorage.setItem(
      storageKey,
      JSON.stringify({
        currentPage,
        recordsPerPage,
      }),
    );
  }, [currentPage, recordsPerPage, storageKey]);

  
  const handlePreviousPage = () => {
    setCurrentPage((p) => Math.max(p - 1, 1));
  };

  const handleNextPage = (totalPages: number) => {
    setCurrentPage((p) => Math.min(p + 1, totalPages));
  };

  const handleRecordsPerPageChange = (value: number) => {
    setRecordsPerPage(value);
    setCurrentPage(1);
  };

  const handleResetPagination = () => {
    sessionStorage.removeItem(storageKey);
    setCurrentPage(defaultPage);
    setRecordsPerPage(defaultPerPage);
  };

  return {
    currentPage,
    recordsPerPage,
    setCurrentPage,
    setRecordsPerPage,
    handlePreviousPage,
    handleNextPage,
    handleRecordsPerPageChange,
    handleResetPagination,
  };
};
