/**
 * 선박 액션 관리 커스텀 훅
 *
 * @description 선박의 상태 전환(일반/선택/삭제)을 관리하는 React 훅입니다.
 * ReplayV2 컴포넌트의 상태 전환 로직을 재사용하며, 드래그앤드롭 기능을 지원합니다.
 *
 * 선박 상태:
 * - NORMAL: 일반 항적 (기본 상태)
 * - SELECTED: 선택된 항적 (리플레이에 포함)
 * - DELETED: 삭제된 항적 (숨김 처리)
 *
 * 상태 전환 규칙:
 * - 각 선박은 세 가지 상태 중 하나만 가질 수 있음 (상호 배타적)
 * - DELETE 액션: 일반/선택 → 삭제, 삭제 → 일반
 * - INSERT 액션: 일반 → 선택, 삭제 → 선택, 선택 → 일반
 *
 * @module hooks/useVesselActions
 */
import { useCallback } from 'react';
import useReplayStore from '../../../stores/replayStore';
import { VesselState } from '../../../types/replay.types';

/**
 * 선박 액션 관리 훅
 *
 * @returns {Object} 선박 상태 관리 함수들
 * @returns {Function} handleDragDrop - 드래그앤드롭 결과 처리 함수
 * @returns {Function} setVesselState - 선박 상태 직접 설정 함수
 * @returns {Function} handleVesselStateTransition - 상태 전환 로직 (디버깅용)
 *
 * @example
 * const { handleDragDrop, setVesselState } = useVesselActions();
 * setVesselState('vessel_001', VesselState.SELECTED);
 */
export const useVesselActions = () => {
  /**
   * 선박 상태 전환 로직
   *
   * @description ReplayV2의 상태 전환 로직을 재현합니다.
   * 선박은 일반/선택/삭제 중 하나의 상태만 가질 수 있으며, 상태 간 전환은 DELETE/INSERT 액션으로 수행됩니다.
   * replayStore.setVesselState를 사용하여 Map/Set 동기화 보장
   *
   * @param {string} vesselId - 선박 ID
   * @param {'DELETE' | 'INSERT'} action - 수행할 액션
   * @param {boolean} isCurrentlyDeleted - 현재 삭제 상태 여부
   * @param {boolean} isCurrentlySelected - 현재 선택 상태 여부
   * @private
   */
  const handleVesselStateTransition = useCallback(
    (vesselId, action, isCurrentlyDeleted, isCurrentlySelected) => {
      // 상태 전환 로직 (상호 배타적)
      let targetState;

      if (action === 'DELETE') {
        if (isCurrentlyDeleted) {
          // 삭제된 항적 → 일반 항적
          targetState = VesselState.NORMAL;
        } else {
          // 선택된 항적 또는 일반 항적 → 삭제된 항적
          targetState = VesselState.DELETED;
        }
      } else {
        // action === 'INSERT'
        if (isCurrentlyDeleted) {
          // 삭제된 항적 → 선택된 항적
          targetState = VesselState.SELECTED;
        } else if (isCurrentlySelected) {
          // 선택된 항적 → 일반 항적
          targetState = VesselState.NORMAL;
        } else {
          // 일반 항적 → 선택된 항적
          targetState = VesselState.SELECTED;
        }
      }

      // replayStore.setVesselState 사용 (Map/Set 모두 동기화)
      useReplayStore.getState().setVesselState(vesselId, targetState);
    },
    [],
  );

  /**
   * 드래그앤드롭 결과 처리
   *
   * @description 드래그앤드롭 이벤트 결과를 상태 전환 로직으로 변환하여 처리합니다
   * @param {Object} result - 드래그앤드롭 결과 (vesselId, sourceState, targetState)
   */
  const handleDragDrop = useCallback(
    (result) => {
      const { vesselId, sourceState, targetState } = result;

      // 같은 상태로 드롭하면 무시
      if (sourceState === targetState) return;

      // 드롭 결과를 액션으로 변환
      if (targetState === VesselState.DELETED) {
        // 목표가 삭제 상태 → DELETE 액션
        handleVesselStateTransition(
          vesselId,
          'DELETE',
          false, // 삭제 상태가 아니었음 (다른 상태에서 왔으므로)
          sourceState === VesselState.SELECTED,
        );
      } else if (targetState === VesselState.SELECTED) {
        // 목표가 선택 상태 → INSERT 액션
        handleVesselStateTransition(
          vesselId,
          'INSERT',
          sourceState === VesselState.DELETED,
          false, // 선택 상태가 아니었음 (다른 상태에서 왔으므로)
        );
      } else if (targetState === VesselState.NORMAL) {
        // 목표가 일반 상태
        if (sourceState === VesselState.DELETED) {
          // 삭제 → 일반: DELETE 액션 (토글)
          handleVesselStateTransition(vesselId, 'DELETE', true, false);
        } else if (sourceState === VesselState.SELECTED) {
          // 선택 → 일반: INSERT 액션 (토글)
          handleVesselStateTransition(vesselId, 'INSERT', false, true);
        }
      }
    },
    [handleVesselStateTransition],
  );

  /**
   * 선박 상태 직접 설정
   *
   * @description 개별 선박의 상태를 특정 상태로 직접 설정합니다
   * @param {string} vesselId - 선박 ID
   * @param {string} targetState - 목표 상태 (NORMAL, SELECTED, DELETED)
   */
  const setVesselState = useCallback((vesselId, targetState) => {
    const { deletedVesselIds, selectedVesselIds } = useReplayStore.getState();

    const currentlyDeleted = deletedVesselIds.has(vesselId);
    const currentlySelected = selectedVesselIds.has(vesselId);
    const currentState = currentlyDeleted
      ? VesselState.DELETED
      : currentlySelected
      ? VesselState.SELECTED
      : VesselState.NORMAL;

    if (currentState === targetState) return; // 이미 해당 상태

    handleDragDrop({
      vesselId,
      sourceState: currentState,
      targetState,
    });
  }, [handleDragDrop]);

  return {
    handleDragDrop,
    setVesselState,
    handleVesselStateTransition, // 디버깅용
  };
};
