import { useCallback, useState } from "react";

/**
 * Hook để tính radius cố định cho Circle trên MapView
 * Radius sẽ được điều chỉnh dựa trên zoom level để giữ kích thước pixel cố định
 */
export const useFixedCircleRadius = (pixelRadius: number = 30) => {
  const [radius, setRadius] = useState(100); // Giá trị default

  const calculateRadiusFromZoom = useCallback((zoomLevel: number) => {
    // Công thức: radius (meters) = pixelRadius * 156543.04 * cos(latitude) / 2^(zoomLevel + 8)
    // Đơn giản hơn: radius tỉ lệ với 2^(maxZoom - currentZoom)
    // Khi zoom = 14, dùng radius = 100 làm reference
    const baseZoom = 14;
    const baseRadius = 100;

    // Mỗi level zoom tương ứng với 2x sự khác biệt
    const zoomDifference = baseZoom - zoomLevel;
    const calculatedRadius = baseRadius * Math.pow(2, zoomDifference);

    return Math.max(calculatedRadius, 10); // Minimum 10 meters
  }, []);

  const handleZoomChange = useCallback(
    (zoomLevel: number) => {
      const newRadius = calculateRadiusFromZoom(zoomLevel);
      setRadius(newRadius);
    },
    [calculateRadiusFromZoom]
  );

  return {
    radius,
    handleZoomChange,
  };
};

/**
 * Alternative: Sử dụng Polygon thay vì Circle để có kích thước cố định theo pixel
 * Tạo một hình tròn bằng Polygon với điểm tâm là coordinate
 */
export const createCircleCoordinates = (
  center: { latitude: number; longitude: number },
  radiusInMeters: number,
  points: number = 36
) => {
  const coordinates = [];
  const latDelta = radiusInMeters / 111000; // 1 degree ~ 111km

  for (let i = 0; i < points; i++) {
    const angle = (i / points) * (2 * Math.PI);
    const longitude =
      center.longitude +
      (latDelta * Math.cos(angle)) /
        Math.cos((center.latitude * Math.PI) / 180);
    const latitude = center.latitude + latDelta * Math.sin(angle);

    coordinates.push({ latitude, longitude });
  }

  return coordinates;
};
