import { useState, useEffect, useCallback } from 'react';
import { PaginationOptions, PaginationResult } from '../types';
import { calculatePagination } from '../utils/pagination';

export function usePagination(options: PaginationOptions): PaginationResult & {
  setPage: (page: number) => void;
  setPageSize: (size: number) => void;
} {
  const [currentPage, setCurrentPage] = useState(options.currentPage);
  const [pageSize, setPageSize] = useState(options.pageSize);
  
  const paginationResult = calculatePagination({
    ...options,
    currentPage,
    pageSize,
  });
  
  const setPage = useCallback((page: number) => {
    const totalPages = Math.ceil(options.totalItems / pageSize);
    if (page >= 1 && page <= totalPages) {
      setCurrentPage(page);
    }
  }, [options.totalItems, pageSize]);
  
  useEffect(() => {
    if (currentPage > Math.ceil(options.totalItems / pageSize)) {
      setCurrentPage(1);
    }
  }, [options.totalItems, pageSize, currentPage]);
  
  return {
    ...paginationResult,
    setPage,
    setPageSize,
  };
}