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

import { router } from '@inertiajs/react';

import { usePaginatedData } from './usePaginatedData';

vi.mock('@inertiajs/react', () => ({
  router: {
    reload: vi.fn(),
  },
}));

describe('usePaginatedData', () => {
  beforeEach(() => {
    vi.mocked(router.reload).mockReset();
  });

  it('starts with isLoading false', () => {
    const { result } = renderHook(() => usePaginatedData());
    expect(result.current.isLoading).toBe(false);
  });

  it('calls router.reload with page param and preserveState on goToPage', () => {
    const { result } = renderHook(() => usePaginatedData());

    act(() => {
      result.current.goToPage(3);
    });

    expect(router.reload).toHaveBeenCalledWith(
      expect.objectContaining({
        data: expect.objectContaining({ page: 3 }),
        replace: true,
      }),
    );
  });

  it('merges preserveParams into data', () => {
    const { result } = renderHook(() =>
      usePaginatedData({ preserveParams: { filter: 'active', sort: 'desc' } }),
    );

    act(() => {
      result.current.goToPage(2);
    });

    expect(router.reload).toHaveBeenCalledWith(
      expect.objectContaining({
        data: { page: 2, filter: 'active', sort: 'desc' },
      }),
    );
  });

  it('sets isLoading to true immediately and resets via onFinish', () => {
    let capturedOnFinish: (() => void) | undefined;
    vi.mocked(router.reload).mockImplementation((opts) => {
      capturedOnFinish = (opts as { onFinish?: () => void }).onFinish;
    });

    const { result } = renderHook(() => usePaginatedData());

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

    expect(result.current.isLoading).toBe(true);

    act(() => {
      capturedOnFinish?.();
    });

    expect(result.current.isLoading).toBe(false);
  });
});
