/**
 * 리플레이 타입 정의 및 상수
 * 참조: src/tracking/types/tracking.types.ts
 */

// =====================================
// 연결 상태
// =====================================
export const ConnectionState = {
  DISCONNECTED: 'DISCONNECTED',
  CONNECTING: 'CONNECTING',
  CONNECTED: 'CONNECTED',
  ERROR: 'ERROR',
};

// =====================================
// 쿼리 상태
// =====================================
export const QueryStatus = {
  PROCESSING: 'PROCESSING',
  COMPLETED: 'COMPLETED',
  ERROR: 'ERROR',
  CANCELLED: 'CANCELLED',
};

// =====================================
// 선박 상태 (기본/선택/삭제)
// =====================================
export const VesselState = {
  NORMAL: 'NORMAL',
  SELECTED: 'SELECTED',
  DELETED: 'DELETED',
};

// =====================================
// 간소화 모드
// =====================================
export const SimplificationMode = {
  AUTO: 'AUTO',           // 자동 (zoom 기반)
  ADAPTIVE: 'ADAPTIVE',   // 적응형
  AGGRESSIVE: 'AGGRESSIVE', // 공격적 (최대 압축)
};

// =====================================
// 배속 옵션
// =====================================
export const PLAYBACK_SPEEDS = [1, 10, 50, 100, 500, 1000];

// =====================================
// 필터 모듈 타입
// =====================================
export const FilterModuleType = {
  CUSTOM: 'custom',   // 선박 아이콘
  PATH: 'path',       // 항적 라인
  LABEL: 'label',     // 라벨
};

// =====================================
// 기본 필터 설정
// =====================================
export const DEFAULT_FILTER_MODULE = {
  showNormal: true,
  showSelected: true,
  showDeleted: false,
};

// =====================================
// 요청/응답 타입 체크
// =====================================

/**
 * TrackChunkResponse 타입 체크
 */
export function isTrackChunkResponse(data) {
  return (
    data &&
    typeof data === 'object' &&
    typeof data.queryId === 'string' &&
    typeof data.chunkIndex === 'number' &&
    (Array.isArray(data.tracks) ||
      Array.isArray(data.mergedTracks) ||
      Array.isArray(data.compactTracks))
  );
}

/**
 * QueryStatusUpdate 타입 체크
 */
export function isQueryStatusUpdate(data) {
  return (
    data &&
    typeof data === 'object' &&
    typeof data.queryId === 'string' &&
    typeof data.status === 'string' &&
    Object.values(QueryStatus).includes(data.status)
  );
}

// =====================================
// 청크 응답 정규화
// =====================================

/**
 * 청크 응답에서 tracks 추출
 * 다양한 필드명 지원 (tracks, mergedTracks, compactTracks)
 */
export function extractTracks(chunkResponse) {
  return (
    chunkResponse.tracks ||
    chunkResponse.mergedTracks ||
    chunkResponse.compactTracks ||
    []
  );
}

/**
 * 청크 응답 정규화
 */
export function normalizeChunkResponse(raw) {
  return {
    queryId: raw.queryId,
    chunkIndex: raw.chunkIndex,
    totalChunks: raw.totalChunks || null,
    tracks: extractTracks(raw),
    estimatedSize: raw.estimatedSize || 0,
    metadata: raw.metadata || null,
  };
}

// =====================================
// 유틸리티 함수
// =====================================

/**
 * 타임스탬프 파싱 (밀리초로 변환)
 * 참조: mda-react-front/src/tracking/stores/mergedTrackStore.ts - getMergedPath
 *
 * 지원 형식:
 * - Unix timestamp (10자리 이상 숫자 문자열) → 초 단위 → * 1000
 * - KST 문자열 ('YYYY-MM-DD HH:mm:ss') → 브라우저 로컬 시간대로 해석
 * - ISO 형식 → Date.parse()
 */
export function parseTimestamp(timestamp) {
  if (typeof timestamp === 'number') {
    // 10억보다 작으면 초 단위로 간주 (2001년 9월 이전은 초 단위)
    if (timestamp < 10000000000) {
      return timestamp * 1000;
    }
    return timestamp;
  }

  if (typeof timestamp === 'string') {
    // Unix timestamp 감지 (10자리 이상 숫자 문자열)
    if (/^\d{10,}$/.test(timestamp)) {
      // UTC Unix timestamp를 밀리초로 변환 (시간대 변환 없음)
      return parseInt(timestamp, 10) * 1000;
    }

    // KST 문자열 처리 ('YYYY-MM-DD HH:mm:ss' 형식 - KST 시간)
    if (timestamp.includes(' ') && !timestamp.includes('T')) {
      const [datePart, timePart] = timestamp.split(' ');
      // 브라우저가 로컬 시간대(KST)로 해석하여 UTC ms 반환
      return new Date(`${datePart}T${timePart}`).getTime();
    }

    // ISO 형식 또는 기타
    const parsed = new Date(timestamp).getTime();
    return isNaN(parsed) ? 0 : parsed;
  }

  return 0;
}

/**
 * 배속 라벨 생성
 */
export function getSpeedLabel(speed) {
  if (speed === 1) return '1x';
  if (speed < 1000) return `${speed}x`;
  return `${speed / 1000}k`;
}

/**
 * 선박 종류 한글 라벨
 */
export const SHIP_KIND_LABELS = {
  '000020': '어선',
  '000021': '경비함정',
  '000022': '여객선',
  '000023': '화물선',
  '000024': '유조선',
  '000025': '관공선',
  '000027': '일반',
  '000028': '부이',
};

/**
 * 신호원 한글 라벨
 */
export const SIGNAL_SOURCE_LABELS = {
  '000001': 'AIS',
  '000002': 'E-NAV',
  '000003': 'V-PASS',
  '000004': 'VTS AIS',
  '000005': 'RADAR',
  '000016': 'D MF/HF',
};
