/** 기상 데이터 유틸리티 */

const DIRECTION_LABELS = ['N', 'NE', 'E', 'SE', 'S', 'SW', 'W', 'NW'] as const;
const DIRECTION_ARROWS = ['↓', '↙', '←', '↖', '↑', '↗', '→', '↘'] as const;

/**
 * 풍향 각도 → 8방위 라벨.
 * 풍향은 "바람이 불어오는 방향"이므로 0° = 북풍(N).
 */
export function getWindDirectionLabel(deg: number | null): string {
  if (deg == null) return '-';
  const idx = Math.round(((deg % 360) + 360) % 360 / 45) % 8;
  return DIRECTION_LABELS[idx];
}

/**
 * 풍향 각도 → 화살표 문자.
 * 바람이 불어가는 방향을 가리킴 (풍향의 반대).
 */
export function getWindArrow(deg: number | null): string {
  if (deg == null) return '';
  const idx = Math.round(((deg % 360) + 360) % 360 / 45) % 8;
  return DIRECTION_ARROWS[idx];
}

export type WaveSeverity = 'calm' | 'moderate' | 'rough' | 'severe';

/** 파고 등급 분류 */
export function getWaveSeverity(m: number | null): WaveSeverity {
  if (m == null || m < 0.5) return 'calm';
  if (m < 1.5) return 'moderate';
  if (m < 2.5) return 'rough';
  return 'severe';
}

/**
 * WMO Weather Interpretation Code → 한글 라벨.
 * https://open-meteo.com/en/docs 참조.
 */
export function getWeatherLabel(code: number | null): string {
  if (code == null) return '-';
  if (code === 0) return '맑음';
  if (code <= 3) return ['약간 흐림', '흐림', '매우 흐림'][code - 1];
  if (code <= 49) return '안개';
  if (code <= 59) return '이슬비';
  if (code <= 69) return '비';
  if (code <= 79) return '눈';
  if (code <= 84) return '소나기';
  if (code <= 94) return '뇌우';
  if (code <= 99) return '뇌우(우박)';
  return '-';
}

/**
 * MultiPolygon 좌표 배열에서 산술 평균 centroid 계산.
 * GeoJSON MultiPolygon: number[][][][]
 */
export function computeMultiPolygonCentroid(
  coordinates: number[][][][],
): [number, number] {
  let sumLon = 0;
  let sumLat = 0;
  let count = 0;

  for (const polygon of coordinates) {
    // 외곽 링만 사용 (polygon[0])
    const ring = polygon[0];
    if (!ring) continue;
    for (const coord of ring) {
      sumLon += coord[0];
      sumLat += coord[1];
      count++;
    }
  }

  if (count === 0) return [0, 0];
  return [sumLon / count, sumLat / count];
}
