import { renderHook, act } from '@testing-library/react-hooks';
import { useTablePagination } from '../useTablePagination';

describe('useTablePagination', () => {
    const data = Array.from({ length: 50 }, (_, i) => i + 1);

    it('returns correct pagination state', () => {
        const { result } = renderHook(() => useTablePagination(data));

        expect(result.current.page).toBe(0);
        expect(result.current.pageSize).toBe(20);
        expect(result.current.totalCount).toBe(50);
        expect(result.current.paginated).toBe(true);
        expect(result.current.data).toEqual(data.slice(0, 20));
    });

    it('returns all data if data length is less than pageSize', () => {
        const smallData = [1, 2, 3];
        const { result } = renderHook(() => useTablePagination(smallData));

        expect(result.current.data).toEqual(smallData);
        expect(result.current.paginated).toBe(false);
    });

    it('changes page correctly', () => {
        const { result } = renderHook(() => useTablePagination(data));

        act(() => {
            result.current.onPageChange(1);
        });

        expect(result.current.page).toBe(1);
        expect(result.current.data).toEqual(data.slice(20, 40));
    });

    it('returns empty array if tableData is empty', () => {
        const { result } = renderHook(() => useTablePagination([]));

        expect(result.current.data).toEqual([]);
        expect(result.current.totalCount).toBe(0);
        expect(result.current.paginated).toBe(false);
    });

    it('handles custom pageSize', () => {
        const { result } = renderHook(() =>
            useTablePagination(data, { pageSize: 5 })
        );

        expect(result.current.pageSize).toBe(5);
        expect(result.current.data).toEqual(data.slice(0, 5));

        act(() => {
            result.current.onPageChange(1);
        });

        expect(result.current.data).toEqual(data.slice(5, 10));
    });

    it('handles indexByColumn option', () => {
        const indexedData = data.map((item, index) => ({
            id: item,
            index: index + 1,
        }));
        const { result } = renderHook(() =>
            useTablePagination(indexedData, { indexByColumn: 'index' })
        );

        expect(result.current.data).toEqual(indexedData.slice(0, 20));

        act(() => {
            result.current.onPageChange(1);
        });

        expect(result.current.data).toEqual(indexedData.slice(20, 40));
    });

    it('returns correct data when indexByColumn is used with less data', () => {
        const indexedData = [
            { id: 1, index: 1 },
            { id: 2, index: 2 },
        ];
        const { result } = renderHook(() =>
            useTablePagination(indexedData, { indexByColumn: 'index' })
        );

        expect(result.current.data).toEqual(indexedData);
        expect(result.current.totalCount).toBe(2);
        expect(result.current.paginated).toBe(false);
    });

    it('handles alwaysVisible option', () => {
        const { result } = renderHook(() =>
            useTablePagination(data.slice(0, 5), {
                alwaysVisible: true,
                pageSize: 20,
            })
        );

        expect(result.current.paginated).toBe(true);
    });
});
