/**
 * 측정 도구 React 훅
 * - Zustand 상태(activeMeasureTool, areaShape) ↔ OL 인터랙션 연결
 * - ESC 키로 측정 취소
 * - 도구 전환 시 이전 세션 자동 정리
 */
import { useEffect, useRef } from 'react';
import { useMapStore } from '../../stores/mapStore';
import {
  MeasureSession,
  setupDistanceMeasure,
  setupAreaMeasure,
  setupRangeRingMeasure,
} from './measure';

export default function useMeasure() {
  const map = useMapStore((s) => s.map);
  const activeTool = useMapStore((s) => s.activeMeasureTool);
  const areaShape = useMapStore((s) => s.areaShape);
  const clearMeasure = useMapStore((s) => s.clearMeasure);
  const sessionRef = useRef(null);

  // ESC 키로 측정 취소
  useEffect(() => {
    const handleKeyDown = (e) => {
      if (e.key === 'Escape' && activeTool) {
        clearMeasure();
      }
    };
    document.addEventListener('keydown', handleKeyDown);
    return () => document.removeEventListener('keydown', handleKeyDown);
  }, [activeTool, clearMeasure]);

  // 도구 활성화/비활성화
  useEffect(() => {
    // 이전 세션 정리
    if (sessionRef.current) {
      sessionRef.current.dispose();
      sessionRef.current = null;
    }

    if (!map || !activeTool) return;

    // 면적 도구: 도형 선택 전까지 대기
    if (activeTool === 'area' && !areaShape) return;

    const session = new MeasureSession(map);
    const source = session.createLayer();
    sessionRef.current = session;

    switch (activeTool) {
      case 'distance':
        setupDistanceMeasure(session, source);
        break;
      case 'area':
        setupAreaMeasure(session, source, areaShape);
        break;
      case 'rangeRing':
        setupRangeRingMeasure(session, source);
        break;
      default:
        break;
    }

    return () => {
      if (sessionRef.current) {
        sessionRef.current.dispose();
        sessionRef.current = null;
      }
    };
  }, [map, activeTool, areaShape]);
}
