/** Pasquill-Gifford 대기안정도 등급 */
export type StabilityClass = 'A' | 'B' | 'C' | 'D' | 'E' | 'F';

/** 확산 모델 타입 */
export type DispersionModel = 'plume' | 'puff' | 'dense_gas';

/** 예측 알고리즘 */
export type AlgorithmType = 'ALOHA (EPA)' | 'CAMEO' | 'Gaussian Plume' | 'AERMOD';

/** 유출 형태 (UI 선택값) */
export type ReleaseType = '연속 유출' | '순간 유출' | '풀(Pool) 증발';

/** 기상 조건 */
export interface MeteoParams {
  windSpeed: number; // 풍속 (m/s)
  windDirDeg: number; // 풍향 (기상 기준, 0=북, 90=동)
  stability: StabilityClass;
  temperature: number; // 기온 (K)
  pressure: number; // 기압 (Pa)
  mixingHeight: number; // 혼합층 높이 (m)
}

/** 누출원 정보 */
export interface SourceParams {
  Q: number; // 배출률 (g/s) — Plume용
  QTotal: number; // 총 누출량 (g) — Puff용
  x0: number; // 누출 위치 X (m)
  y0: number; // 누출 위치 Y (m)
  z0: number; // 누출 높이 (m)
  releaseDuration: number; // 누출 지속시간 (s), 0=순간
  molecularWeight: number; // 분자량 (g/mol)
  vaporPressure: number; // 증기압 (mmHg)
  densityGas: number; // 가스 밀도 (kg/m³)
  poolRadius: number; // 액체풀 반경 (m)
}

/** 시뮬레이션 격자 및 시간 설정 */
export interface SimParams {
  xRange: [number, number]; // X 범위 (m)
  yRange: [number, number]; // Y 범위 (m)
  nx: number; // X 격자 수
  ny: number; // Y 격자 수
  zRef: number; // 농도 계산 기준 높이 (m, 호흡선)
  tStart: number; // 시작 시간 (s)
  tEnd: number; // 종료 시간 (s)
  dt: number; // 시간 간격 (s)
}

/** 지도 위 농도 점 (HeatmapLayer 입력) */
export interface DispersionPoint {
  lon: number;
  lat: number;
  concentration: number; // ppm
}

/** AEGL 거리 결과 */
export interface AeglDistances {
  aegl1: number; // m (풍하 최대 도달 거리)
  aegl2: number;
  aegl3: number;
}

/** AEGL 면적 결과 */
export interface AeglAreas {
  aegl1: number; // km²
  aegl2: number;
  aegl3: number;
}

/** 확산 계산 전체 결과 */
export interface DispersionGridResult {
  points: DispersionPoint[];
  maxConcentration: number; // ppm
  aeglDistances: AeglDistances;
  aeglAreas: AeglAreas;
  modelType: DispersionModel;
  timeStep: number; // 현재 시간 (s)
  substance: string;
}

/** computeDispersion 입력 파라미터 */
export interface ComputeDispersionParams {
  meteo: MeteoParams;
  source: SourceParams;
  sim: SimParams;
  modelType: DispersionModel;
  originLon: number; // 누출원 경도
  originLat: number; // 누출원 위도
  substanceName: string;
  t: number; // 계산 시점 (s)
  algorithm?: AlgorithmType; // 예측 알고리즘 (sigma 파라미터 결정)
}

/** 물질 독성 정보 */
export interface SubstanceToxicity {
  nameKr: string;
  nameEn: string;
  aegl1: number; // ppm (1시간)
  aegl2: number;
  aegl3: number;
  idlh: number;
  mw: number; // g/mol
  densityGas: number; // kg/m³
  vaporPressure: number; // mmHg
  poolRadius: number; // 기본 풀 반경 (m)
  Q: number; // 기본 배출률 (g/s)
  QTotal: number; // 기본 총 누출량 (g)
}

/** 기상 자동조회 결과 */
export interface WeatherFetchResult {
  windSpeed: number; // m/s
  windDirection: number; // degrees
  temperature: number; // °C
  humidity: number; // %
  stability: StabilityClass;
  isLoading: boolean;
  error: string | null;
  lastUpdate: Date | null;
}
