/**
 * 선박 분류 관리 커스텀 훅
 *
 * @description 항적 데이터를 상태별(일반/선택/삭제)로 분류하여 제공하는 React 훅입니다.
 * mergedTrackStore의 캐시된 선박 데이터를 구독하고, 각 선박의 상태에 따라 분류합니다.
 *
 * 주요 기능:
 * - 선박 데이터를 상태별로 분류 (NORMAL, SELECTED, DELETED)
 * - 실시간 스토어 변경 감지 및 자동 업데이트
 * - 선박명 기준 정렬
 * - 상태별 카운트 제공
 *
 * @module hooks/useVesselClassification
 */
import { useEffect, useMemo, useState } from 'react';
import useReplayStore from '../../../stores/replayStore';
import useMergedTrackStore from '../../../stores/mergedTrackStore';
import { VesselState } from '../../../types/replay.types';

/**
 * 선박 분류 훅
 *
 * @returns {Object} 선박 분류 결과
 * @returns {Object} vesselsByState - 상태별로 분류된 선박 목록
 * @returns {number} totalCount - 전체 선박 수
 * @returns {boolean} hasVessels - 선박 존재 여부
 * @returns {Object} totalCounts - 상태별 선박 수
 *
 * @example
 * const { vesselsByState, totalCount, hasVessels } = useVesselClassification();
 * console.log(vesselsByState.normal); // 일반 상태 선박 목록
 */
export const useVesselClassification = () => {
  const deletedVesselIds = useReplayStore(state => state.deletedVesselIds);
  const selectedVesselIds = useReplayStore(state => state.selectedVesselIds);
  const vesselStates = useReplayStore(state => state.vesselStates);

  // mergedTrackStore 상태를 구독하기 위한 더미 상태
  const [storeUpdateTrigger, setStoreUpdateTrigger] = useState(0);

  // mergedTrackStore 변경 감지를 위한 useEffect
  useEffect(() => {
    const unsubscribe = useMergedTrackStore.subscribe(() => {
      setStoreUpdateTrigger(prev => prev + 1);
    });
    return unsubscribe;
  }, []);

  const vesselsByState = useMemo(() => {
    const normal = [];
    const selected = [];
    const deleted = [];

    const vesselChunks = useMergedTrackStore.getState().vesselChunks;

    // vesselChunks가 존재하지 않으면 빈 결과 반환
    if (!vesselChunks || vesselChunks.size === 0) {
      return { normal, selected, deleted };
    }

    vesselChunks.forEach((vesselInfo, vesselId) => {
      if (!vesselInfo) return;

      // 상태 결정 (새로운 시스템 우선, 레거시 시스템 폴백)
      let state;
      if (vesselStates instanceof Map && vesselStates.has(vesselId)) {
        state = vesselStates.get(vesselId);
      } else if (deletedVesselIds.has(vesselId)) {
        state = VesselState.DELETED;
      } else if (selectedVesselIds.has(vesselId)) {
        state = VesselState.SELECTED;
      } else {
        state = VesselState.NORMAL;
      }

      // 선박 정보 생성
      const vesselItem = {
        vesselId,
        targetId: vesselInfo.targetId || vesselId.split('_')[1] || vesselId, // 원본 데이터 우선, fallback으로 split
        shipName: vesselInfo.shipName || 'Unknown',
        shipKindCode: vesselInfo.shipKindCode || '000027',
        nationalCode: vesselInfo.nationalCode || '000',
        sigSrcCd: vesselInfo.sigSrcCd || '000001',
        state,
        lastPosition: vesselInfo.chunks?.[0]?.geometry?.[0], // 첫 번째 위치
        lastUpdateTime: Date.now(),
      };

      // 상태별로 분류
      switch (state) {
        case VesselState.NORMAL:
          normal.push(vesselItem);
          break;
        case VesselState.SELECTED:
          selected.push(vesselItem);
          break;
        case VesselState.DELETED:
          deleted.push(vesselItem);
          break;
      }
    });

    // 선박명 기준으로 정렬
    const sortByName = (a, b) =>
      a.shipName.localeCompare(b.shipName);

    return {
      normal: normal.sort(sortByName),
      selected: selected.sort(sortByName),
      deleted: deleted.sort(sortByName),
    };
  }, [deletedVesselIds, selectedVesselIds, vesselStates, storeUpdateTrigger]);

  const totalCount = vesselsByState.normal.length + vesselsByState.selected.length + vesselsByState.deleted.length;
  const hasVessels = totalCount > 0;

  return {
    vesselsByState,
    totalCount,
    hasVessels,
    totalCounts: {
      normal: vesselsByState.normal.length,
      selected: vesselsByState.selected.length,
      deleted: vesselsByState.deleted.length,
      total: totalCount,
    },
  };
};
