require('react-test-renderer');
const { renderHook, act } = require('@testing-library/react-hooks');
const { useLocationTracking } = require('../useLocationTracking');

describe('useLocationTracking', () => {
    let origGeo;

    beforeEach(() => {
        origGeo = global.navigator && global.navigator.geolocation;
        global.navigator = global.navigator || {};
        global.navigator.geolocation = {
            watchPosition: jest.fn((success) => {
                // Immediately call with a sample position
                success({ coords: { latitude: 10, longitude: 20 } });
                // Return a fake id
                return 42;
            }),
            clearWatch: jest.fn()
        };
    });

    afterEach(() => {
        if (origGeo) global.navigator.geolocation = origGeo;
        else delete global.navigator.geolocation;
        jest.resetAllMocks();
    });

    it('starts and stops tracking and collects path', () => {
        const { result } = renderHook(() => useLocationTracking());

        expect(result.current.isTracking).toBe(false);
        act(() => result.current.startTracking());
        expect(result.current.isTracking).toBe(true);
        expect(result.current.path.length).toBeGreaterThanOrEqual(1);

        act(() => result.current.stopTracking());
        expect(result.current.isTracking).toBe(false);
        expect(global.navigator.geolocation.clearWatch).toHaveBeenCalled();
    });

    it('clears path', () => {
        const { result } = renderHook(() => useLocationTracking());
        act(() => result.current.startTracking());
        expect(result.current.path.length).toBeGreaterThanOrEqual(1);
        act(() => result.current.clear());
        expect(result.current.path.length).toBe(0);
    });
});
