/**
 * 추적 모드 스토어
 * - 지도 모드: 일반 지도 뷰
 * - 선박 모드: 특정 함정 중심 추적 + 반경 필터링
 */
import { create } from 'zustand';
import { subscribeWithSelector } from 'zustand/middleware';

// 반경 옵션 (NM)
export const RADIUS_OPTIONS = [10, 25, 50, 100, 200];

// NM to meters 변환 (1 NM = 1852m)
export const NM_TO_METERS = 1852;

/**
 * 경비함정 여부 판별
 * - originalTargetId가 '#'으로 시작
 * - 또는 IP 형태 (10.xxx.xxx.xxx)
 * @param {string} originalTargetId
 * @returns {boolean}
 */
export function isPatrolShip(originalTargetId) {
  if (!originalTargetId) return false;
  // '#'으로 시작
  if (originalTargetId.startsWith('#')) return true;
  // IP 형태 (10.xxx.xxx.xxx)
  if (/^10\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(originalTargetId)) return true;
  return false;
}

/**
 * 두 좌표 간 거리 계산 (Haversine, 미터 단위)
 * @param {number} lon1
 * @param {number} lat1
 * @param {number} lon2
 * @param {number} lat2
 * @returns {number} 거리 (미터)
 */
export function calculateDistance(lon1, lat1, lon2, lat2) {
  const R = 6371000; // 지구 반지름 (미터)
  const toRad = (deg) => (deg * Math.PI) / 180;

  const dLat = toRad(lat2 - lat1);
  const dLon = toRad(lon2 - lon1);
  const a =
    Math.sin(dLat / 2) * Math.sin(dLat / 2) +
    Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) * Math.sin(dLon / 2) * Math.sin(dLon / 2);
  const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));

  return R * c;
}

/**
 * 선박이 반경 내에 있는지 확인
 * @param {Object} ship - 선박 데이터 (longitude, latitude)
 * @param {number} centerLon - 중심 경도
 * @param {number} centerLat - 중심 위도
 * @param {number} radiusNM - 반경 (NM)
 * @returns {boolean}
 */
export function isWithinRadius(ship, centerLon, centerLat, radiusNM) {
  if (!ship.longitude || !ship.latitude) return false;
  const radiusMeters = radiusNM * NM_TO_METERS;
  const distance = calculateDistance(centerLon, centerLat, ship.longitude, ship.latitude);
  return distance <= radiusMeters;
}

/**
 * 추적 모드 스토어
 */
const useTrackingModeStore = create(subscribeWithSelector((set, get) => ({
  // =====================
  // 상태 (State)
  // =====================

  /** 현재 모드: 'map' | 'ship' */
  mode: 'map',

  /** 추적 중인 함정 featureId */
  trackedShipId: null,

  /** 추적 중인 함정 데이터 (실시간 업데이트용 캐시) */
  trackedShip: null,

  /** 반경 (NM) */
  radiusNM: 25,

  /** 함정 선택 드롭다운 표시 여부 */
  showShipSelector: false,

  // =====================
  // 액션 (Actions)
  // =====================

  /**
   * 지도 모드로 전환
   */
  setMapMode: () => {
    set({
      mode: 'map',
      trackedShipId: null,
      trackedShip: null,
      showShipSelector: false,
    });
  },

  /**
   * 선박 모드로 전환 (함정 선택 드롭다운 표시)
   */
  setShipMode: () => {
    set({
      mode: 'ship',
      showShipSelector: true,
    });
  },

  /**
   * 함정 선택
   * @param {string} featureId
   * @param {Object} ship - 선박 데이터
   */
  selectTrackedShip: (featureId, ship) => {
    set({
      mode: 'ship',
      trackedShipId: featureId,
      trackedShip: ship,
      showShipSelector: false,
    });
  },

  /**
   * 추적 중인 함정 데이터 업데이트 (실시간)
   * @param {Object} ship
   */
  updateTrackedShip: (ship) => {
    set({ trackedShip: ship });
  },

  /**
   * 반경 설정
   * @param {number} radiusNM
   */
  setRadius: (radiusNM) => {
    set({ radiusNM });
  },

  /**
   * 함정 선택 드롭다운 토글
   */
  toggleShipSelector: () => {
    set((state) => ({ showShipSelector: !state.showShipSelector }));
  },

  /**
   * 함정 선택 드롭다운 닫기
   */
  closeShipSelector: () => {
    set({ showShipSelector: false });
  },

  /**
   * 모드 토글 (지도 <-> 선박)
   */
  toggleMode: () => {
    const { mode } = get();
    if (mode === 'map') {
      get().setShipMode();
    } else {
      get().setMapMode();
    }
  },

  // =====================
  // 셀렉터 (Selectors)
  // =====================

  /**
   * 선박 모드 활성화 여부
   */
  isShipMode: () => get().mode === 'ship',

  /**
   * 추적 중인 함정이 있는지
   */
  hasTrackedShip: () => get().trackedShipId !== null,

  /**
   * 추적 중인 함정의 중심 좌표
   * @returns {{ lon: number, lat: number } | null}
   */
  getTrackedCenter: () => {
    const { trackedShip } = get();
    if (!trackedShip || !trackedShip.longitude || !trackedShip.latitude) return null;
    return { lon: trackedShip.longitude, lat: trackedShip.latitude };
  },
})));

export default useTrackingModeStore;
