/*
 * SFR-02: 시스템 기본 환경설정 및 공통 기능
 * 공통코드 기준정보 통합 관리 모듈
 *
 * 4개 분류 | 875개 코드
 * - 해역분류 52개  (해양경찰청 관할 기준)
 * - 어종    578개 (국립수산과학원 공식 어종코드)
 * - 어업유형 59개  (수산업법 허가·면허 구분)
 * - 선박유형 186개 (MDA 5개 출처 통합)
 */

import areaData from './areasCodes.json';
import speciesData from './speciesCodes.json';
import fisheryData from './fisheryCodes.json';
import vesselTypeData from './vesselTypeCodes.json';

// ─── 타입 정의 ──────────────────────────

export interface AreaCode {
  code: string;       // HA-101 ~ HA-501
  major: string;      // 서해, 남해, 동해, 제주, 광역(원해)
  mid: string;        // 광역구역, 특별경비수역, 연안구역, 내해구역
  name: string;       // 소분류(해역명)
  authority: string;  // 관할기관
  note: string;
}

export interface SpeciesCode {
  code: string;       // 10000 ~ 90000 계열
  major: string;      // 대분류: 어류, 패류, 갑각류, 연체류, 해조류 등
  mid: string;        // 중분류(상위)
  name: string;       // 어종명
  nameEn: string;     // 영문명
  scientific: string; // 학명
  area: string;       // 주요 서식해역
  active: boolean;    // 사용여부
  fishing: boolean;   // 낚시연계 여부
}

export interface FisheryCode {
  code: string;       // FV-101 / FT-xxx
  major: string;      // 근해어업, 연안어업, 구획어업, 마을어업, 양식어업, 원양어업, 기타어업
  mid: string;        // 트롤, 선망, 연승, 자망 등
  name: string;       // 어업유형명
  target: string;     // 주요 어획대상
  permit: string;     // 허가/면허
  law: string;        // 수산업법 근거
}

export interface VesselTypeCode {
  code: string;       // VT-100 ~ VT-905
  srcCode: string;    // 원본코드 (ship_ty_cd)
  srcDetail: string;  // 원본세부코드 (src_ty_cd)
  major: string;      // 어선, 여객선, 화물선, 유조선, 관공선, 함정, 항공기, 기타선
  mid: string;        // 중분류
  name: string;       // 선박유형명
  source: string;     // 데이터출처: RRA, GIC, PMS, AIS, KSU
  tonnage: string;    // 톤수기준
  purpose: string;    // 주요용도
  aisCode: string;    // AIS/IMO 코드
  note: string;
}

// ─── 코드 데이터 ─────────────────────────

export const AREA_CODES: AreaCode[] = areaData as AreaCode[];
export const SPECIES_CODES: SpeciesCode[] = speciesData as SpeciesCode[];
export const FISHERY_CODES: FisheryCode[] = fisheryData as FisheryCode[];
export const VESSEL_TYPE_CODES: VesselTypeCode[] = vesselTypeData as VesselTypeCode[];

// ─── 조회 유틸리티 ──────────────────────

/** 코드번호로 해역 조회 */
export function getArea(code: string): AreaCode | undefined {
  return AREA_CODES.find((a) => a.code === code);
}

/** 코드번호로 어종 조회 */
export function getSpecies(code: string): SpeciesCode | undefined {
  return SPECIES_CODES.find((s) => s.code === code);
}

/** 코드번호로 어업유형 조회 */
export function getFishery(code: string): FisheryCode | undefined {
  return FISHERY_CODES.find((f) => f.code === code);
}

/** 코드번호로 선박유형 조회 */
export function getVesselType(code: string): VesselTypeCode | undefined {
  return VESSEL_TYPE_CODES.find((v) => v.code === code);
}

/** 해역 대분류 목록 (중복 제거) */
export function getAreaMajors(): string[] {
  return [...new Set(AREA_CODES.map((a) => a.major))];
}

/** 어종 대분류 목록 (중복 제거) */
export function getSpeciesMajors(): string[] {
  return [...new Set(SPECIES_CODES.map((s) => s.major).filter(Boolean))];
}

/** 어업유형 대분류 목록 (중복 제거) */
export function getFisheryMajors(): string[] {
  return [...new Set(FISHERY_CODES.map((f) => f.major))];
}

/** 선박유형 대분류 목록 (중복 제거) */
export function getVesselTypeMajors(): string[] {
  return [...new Set(VESSEL_TYPE_CODES.map((v) => v.major))];
}

/** 대분류로 필터링 */
export function filterByMajor<T extends { major: string }>(items: T[], major: string): T[] {
  if (!major) return items;
  return items.filter((i) => i.major === major);
}

/** 이름 또는 코드로 검색 */
export function searchCodes<T extends { code: string; name: string }>(
  items: T[], query: string
): T[] {
  if (!query) return items;
  const q = query.toLowerCase();
  return items.filter(
    (i) => i.code.toLowerCase().includes(q) || i.name.toLowerCase().includes(q)
  );
}

// ─── 코드 분류별 통계 ───────────────────

export const CODE_STATS = {
  areas: AREA_CODES.length,
  species: SPECIES_CODES.length,
  fishery: FISHERY_CODES.length,
  vesselTypes: VESSEL_TYPE_CODES.length,
  total: AREA_CODES.length + SPECIES_CODES.length + FISHERY_CODES.length + VESSEL_TYPE_CODES.length,
};
