/**
 * 선박 항적 조회 유틸리티 함수
 *
 * 주요 기능:
 * - 시간 기반 위치 보간
 * - 방향(heading) 계산
 * - 날짜시간 포맷팅
 */

/**
 * 두 지점 사이의 선박 위치를 시간 기반으로 보간
 *
 * @param {[number, number]} p1 시작 지점 좌표 [경도, 위도]
 * @param {[number, number]} p2 종료 지점 좌표 [경도, 위도]
 * @param {number} t1 시작 시간 (밀리초)
 * @param {number} t2 종료 시간 (밀리초)
 * @param {number} currentTime 현재 시간 (밀리초)
 * @returns {[number, number]} 보간된 위치 [경도, 위도]
 */
export function interpolatePosition(p1, p2, t1, t2, currentTime) {
  if (t1 === t2) return p1;
  if (currentTime <= t1) return p1;
  if (currentTime >= t2) return p2;

  const ratio = (currentTime - t1) / (t2 - t1);
  const lon = p1[0] + (p2[0] - p1[0]) * ratio;
  const lat = p1[1] + (p2[1] - p1[1]) * ratio;

  return [lon, lat];
}

/**
 * 두 지점 간의 방향(heading) 계산
 * 북쪽을 0도로 하여 시계방향으로 각도를 계산
 *
 * @param {[number, number]} p1 시작 지점 [경도, 위도]
 * @param {[number, number]} p2 종료 지점 [경도, 위도]
 * @returns {number} 방향 각도 (도 단위)
 */
export function calculateHeading(p1, p2) {
  const [lon1, lat1] = p1;
  const [lon2, lat2] = p2;

  const dx = lon2 - lon1;
  const dy = lat2 - lat1;

  let angle = (Math.atan2(dx, dy) * 180) / Math.PI;
  angle = -angle;
  if (angle < 0) angle += 360;

  return angle;
}

/**
 * 날짜시간 포맷팅 (밀리초 -> "YYYY-MM-DD HH:mm:ss")
 *
 * @param {number} timestamp 타임스탬프 (밀리초)
 * @returns {string} 포맷된 날짜시간 문자열
 */
export function formatDateTime(timestamp) {
  const date = new Date(timestamp);
  const year = date.getFullYear();
  const month = String(date.getMonth() + 1).padStart(2, '0');
  const day = String(date.getDate()).padStart(2, '0');
  const hours = String(date.getHours()).padStart(2, '0');
  const minutes = String(date.getMinutes()).padStart(2, '0');
  const seconds = String(date.getSeconds()).padStart(2, '0');
  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}

/**
 * 시간 차이를 사람이 읽기 쉬운 형태로 변환
 *
 * @param {number} milliseconds 밀리초
 * @returns {string} 포맷된 시간 문자열 (예: "2시간 30분")
 */
export function formatDuration(milliseconds) {
  const seconds = Math.floor(milliseconds / 1000);
  const minutes = Math.floor(seconds / 60);
  const hours = Math.floor(minutes / 60);
  const days = Math.floor(hours / 24);

  if (days > 0) {
    return `${days}일 ${hours % 24}시간`;
  } else if (hours > 0) {
    return `${hours}시간 ${minutes % 60}분`;
  } else if (minutes > 0) {
    return `${minutes}분 ${seconds % 60}초`;
  } else {
    return `${seconds}초`;
  }
}
