/**
 * 위반(탐지) 유형 공통 카탈로그
 *
 * 백엔드 violation_classifier.py의 enum 코드를 SSOT로 사용한다.
 * 색상, 라벨(i18n), 정렬 순서를 한 곳에서 관리.
 *
 * 신규 유형 추가/색상 변경 시 이 파일만 수정하면 모든 화면에 반영된다.
 *
 * 사용처:
 *  - Dashboard / MonitoringDashboard 위반 유형 분포 차트
 *  - Statistics 위반 유형별 분포
 *  - EventList / EnforcementHistory 위반 유형 표시
 */

import type { BadgeIntent } from '@lib/theme/variants';

export type ViolationCode =
  | 'EEZ_VIOLATION'
  | 'DARK_VESSEL'
  | 'MMSI_TAMPERING'
  | 'ILLEGAL_TRANSSHIP'
  | 'ILLEGAL_GEAR'
  | 'RISK_BEHAVIOR';

export interface ViolationTypeMeta {
  code: ViolationCode;
  /** i18n 키 (common.json) */
  i18nKey: string;
  /** 차트/UI 색상 (hex) — 차트나 인라인 style용 */
  color: string;
  /** 공통 Badge 컴포넌트 intent */
  intent: BadgeIntent;
  /** i18n 미적용 환경의 폴백 라벨 */
  fallback: { ko: string; en: string };
  /** 정렬 순서 (낮을수록 상단) */
  order: number;
}

export const VIOLATION_TYPES: Record<ViolationCode, ViolationTypeMeta> = {
  EEZ_VIOLATION: {
    code: 'EEZ_VIOLATION',
    i18nKey: 'violation.eezViolation',
    color: '#ef4444',
    intent: 'critical',
    fallback: { ko: 'EEZ 침범', en: 'EEZ Violation' },
    order: 1,
  },
  DARK_VESSEL: {
    code: 'DARK_VESSEL',
    i18nKey: 'violation.darkVessel',
    color: '#f97316',
    intent: 'high',
    fallback: { ko: '다크베셀', en: 'Dark Vessel' },
    order: 2,
  },
  MMSI_TAMPERING: {
    code: 'MMSI_TAMPERING',
    i18nKey: 'violation.mmsiTampering',
    color: '#eab308',
    intent: 'warning',
    fallback: { ko: 'MMSI 변조', en: 'MMSI Tampering' },
    order: 3,
  },
  ILLEGAL_TRANSSHIP: {
    code: 'ILLEGAL_TRANSSHIP',
    i18nKey: 'violation.illegalTransship',
    color: '#a855f7',
    intent: 'purple',
    fallback: { ko: '불법 환적', en: 'Illegal Transship' },
    order: 4,
  },
  ILLEGAL_GEAR: {
    code: 'ILLEGAL_GEAR',
    i18nKey: 'violation.illegalGear',
    color: '#06b6d4',
    intent: 'cyan',
    fallback: { ko: '불법 어구', en: 'Illegal Gear' },
    order: 5,
  },
  RISK_BEHAVIOR: {
    code: 'RISK_BEHAVIOR',
    i18nKey: 'violation.riskBehavior',
    color: '#6b7280',
    intent: 'muted',
    fallback: { ko: '위험 행동', en: 'Risk Behavior' },
    order: 6,
  },
};

export function getViolationIntent(code: string): BadgeIntent {
  return VIOLATION_TYPES[code as ViolationCode]?.intent ?? 'muted';
}

/** 등록되지 않은 코드를 위한 폴백 색상 팔레트 (안정적 매핑) */
const FALLBACK_PALETTE = ['#ef4444', '#f97316', '#a855f7', '#eab308', '#06b6d4', '#3b82f6', '#10b981', '#6b7280'];

/** 코드 → 색상 (등록 안 된 코드는 코드 해시 기반 안정적 색상 반환) */
export function getViolationColor(code: string): string {
  const meta = VIOLATION_TYPES[code as ViolationCode];
  if (meta) return meta.color;
  // 등록되지 않은 코드: 문자열 해시 기반으로 안정적 색상 할당
  let hash = 0;
  for (let i = 0; i < code.length; i++) hash = (hash * 31 + code.charCodeAt(i)) | 0;
  return FALLBACK_PALETTE[Math.abs(hash) % FALLBACK_PALETTE.length];
}

/**
 * 코드 → 표시 라벨 (i18n)
 * @param code 백엔드 enum 코드
 * @param t react-i18next의 t 함수 (common namespace)
 * @param lang 'ko' | 'en' (현재 언어, fallback 용도)
 */
export function getViolationLabel(
  code: string,
  t: (key: string, opts?: { defaultValue?: string }) => string,
  lang: 'ko' | 'en' = 'ko',
): string {
  const meta = VIOLATION_TYPES[code as ViolationCode];
  if (!meta) return code;
  return t(meta.i18nKey, { defaultValue: meta.fallback[lang] });
}

/** 카탈로그 정렬 순으로 코드 목록 반환 */
export function listViolationCodes(): ViolationCode[] {
  return Object.values(VIOLATION_TYPES)
    .sort((a, b) => a.order - b.order)
    .map((m) => m.code);
}
