import {
  calculateRouteDistance,
  compressRoute,
  deduplicatePoints,
  haversineDistanceMeters,
  isWithinRadiusMeters,
} from './geo.util';

describe('geo.util', () => {
  const a = { latitude: 28.6139, longitude: 77.209 };
  const b = { latitude: 28.6149, longitude: 77.21 };

  it('computes haversine distance', () => {
    const d = haversineDistanceMeters(a, b);
    expect(d).toBeGreaterThan(100);
    expect(d).toBeLessThan(200);
  });

  it('checks radius', () => {
    expect(isWithinRadiusMeters(a, b, 200)).toBe(true);
    expect(isWithinRadiusMeters(a, b, 50)).toBe(false);
  });

  it('deduplicates nearby points', () => {
    const points = [
      { latitude: 1, longitude: 1 },
      { latitude: 1.00001, longitude: 1.00001 },
      { latitude: 2, longitude: 2 },
    ];
    expect(deduplicatePoints(points, 50)).toHaveLength(2);
  });

  it('calculates route distance', () => {
    const d = calculateRouteDistance([a, b]);
    expect(d).toBeGreaterThan(0);
  });

  it('compresses route', () => {
    const route = [
      { latitude: 0, longitude: 0 },
      { latitude: 0.001, longitude: 0.001 },
      { latitude: 0.002, longitude: 0.002 },
      { latitude: 1, longitude: 1 },
    ];
    const compressed = compressRoute(route, 500);
    expect(compressed.length).toBeLessThanOrEqual(route.length);
  });
});
