/**
 * 추적 모드 훅
 * - 선박 모드일 때 추적 함정 중심으로 지도 이동
 * - 반경 원 레이어 생성 및 업데이트
 */
import { useEffect, useRef, useCallback } from 'react';
import { fromLonLat } from 'ol/proj';
import { circular } from 'ol/geom/Polygon';
import VectorLayer from 'ol/layer/Vector';
import VectorSource from 'ol/source/Vector';
import Feature from 'ol/Feature';
import { Fill, Stroke, Style } from 'ol/style';
import { useMapStore } from '../stores/mapStore';
import useShipStore from '../stores/shipStore';
import useTrackingModeStore, { NM_TO_METERS } from '../stores/trackingModeStore';

/**
 * 추적 모드 훅
 * MapContainer에서 호출
 */
export default function useTrackingMode() {
  const map = useMapStore((s) => s.map);
  const features = useShipStore((s) => s.features);

  const mode = useTrackingModeStore((s) => s.mode);
  const trackedShipId = useTrackingModeStore((s) => s.trackedShipId);
  const trackedShip = useTrackingModeStore((s) => s.trackedShip);
  const radiusNM = useTrackingModeStore((s) => s.radiusNM);
  const updateTrackedShip = useTrackingModeStore((s) => s.updateTrackedShip);

  // 반경 원 레이어 ref
  const radiusLayerRef = useRef(null);
  const radiusFeatureRef = useRef(null);

  // 이전 좌표 (중복 업데이트 방지)
  const prevCoordsRef = useRef(null);

  /**
   * 반경 원 레이어 생성
   */
  const createRadiusLayer = useCallback(() => {
    if (!map) return;

    // 기존 레이어 제거
    if (radiusLayerRef.current) {
      map.removeLayer(radiusLayerRef.current);
    }

    const source = new VectorSource();
    const layer = new VectorLayer({
      source,
      style: new Style({
        fill: new Fill({
          color: 'rgba(0, 150, 255, 0.08)', // 매우 투명한 파란색
        }),
        stroke: new Stroke({
          color: 'rgba(0, 150, 255, 0.4)',
          width: 2,
          lineDash: [8, 4],
        }),
      }),
      zIndex: 5, // 선박 레이어보다 낮게
    });

    map.addLayer(layer);
    radiusLayerRef.current = layer;

    return layer;
  }, [map]);

  /**
   * 반경 원 업데이트
   */
  const updateRadiusCircle = useCallback((lon, lat) => {
    if (!radiusLayerRef.current) return;

    const source = radiusLayerRef.current.getSource();
    source.clear();

    // 원형 폴리곤 생성 (WGS84 좌표에서 미터 단위 반경)
    const radiusMeters = radiusNM * NM_TO_METERS;
    const circle = circular([lon, lat], radiusMeters, 64);

    // EPSG:3857로 변환
    circle.transform('EPSG:4326', 'EPSG:3857');

    const feature = new Feature({ geometry: circle });
    radiusFeatureRef.current = feature;
    source.addFeature(feature);
  }, [radiusNM]);

  /**
   * 지도 중심 이동 (애니메이션)
   */
  const centerMapOnShip = useCallback((lon, lat, animate = true) => {
    if (!map) return;

    const center = fromLonLat([lon, lat]);

    if (animate) {
      map.getView().animate({
        center,
        duration: 300,
      });
    } else {
      map.getView().setCenter(center);
    }
  }, [map]);

  // 추적 함정 데이터 실시간 업데이트
  useEffect(() => {
    if (mode !== 'ship' || !trackedShipId) return;

    // features에서 추적 함정의 최신 데이터 가져오기
    const latestShip = features.get(trackedShipId);
    if (!latestShip) return;

    // 좌표가 변경되었는지 확인
    const newCoords = `${latestShip.longitude},${latestShip.latitude}`;
    if (prevCoordsRef.current === newCoords) return;

    prevCoordsRef.current = newCoords;
    updateTrackedShip(latestShip);
  }, [mode, trackedShipId, features, updateTrackedShip]);

  // 선박 모드 활성화 시 레이어 생성 및 초기 위치 설정
  useEffect(() => {
    if (mode !== 'ship' || !trackedShip || !map) {
      // 선박 모드 비활성화 시 레이어 제거
      if (radiusLayerRef.current && map) {
        map.removeLayer(radiusLayerRef.current);
        radiusLayerRef.current = null;
        radiusFeatureRef.current = null;
      }
      prevCoordsRef.current = null;
      return;
    }

    const { longitude, latitude } = trackedShip;
    if (!longitude || !latitude) return;

    // 레이어가 없으면 생성
    if (!radiusLayerRef.current) {
      createRadiusLayer();
    }

    // 반경 원 업데이트
    updateRadiusCircle(longitude, latitude);

    // 지도 중심 이동
    centerMapOnShip(longitude, latitude);
  }, [mode, trackedShip, map, createRadiusLayer, updateRadiusCircle, centerMapOnShip]);

  // 반경 변경 시 원 업데이트
  useEffect(() => {
    if (mode !== 'ship' || !trackedShip) return;

    const { longitude, latitude } = trackedShip;
    if (!longitude || !latitude) return;

    updateRadiusCircle(longitude, latitude);
  }, [radiusNM, mode, trackedShip, updateRadiusCircle]);

  // 컴포넌트 언마운트 시 정리
  useEffect(() => {
    return () => {
      if (radiusLayerRef.current && map) {
        map.removeLayer(radiusLayerRef.current);
        radiusLayerRef.current = null;
      }
    };
  }, [map]);

  return {
    isTrackingActive: mode === 'ship' && trackedShip !== null,
    trackedShip,
    radiusNM,
  };
}
