import type { ApiAlertRule } from "../alerts-service.js"

export type ServerSignal = {
  name: string
  status: "online" | "offline" | "degraded"
  /** Предпоследний сэмпл (для условий «восстановился» / «подключился») */
  prevStatus: "online" | "offline" | "degraded" | null
  /** Третий с конца сэмпл — чтобы «восстановился» не висел истинным до второго online-сэмпла в БД. */
  prev2Status: "online" | "offline" | "degraded" | null
  sampledAt: string
}

export type ProbeSignal = {
  /** Как в UI: `имя пробы → target` */
  key: string
  status: "up" | "warn" | "down"
  rttMs: number | null
  lossPct: number | null
  sampledAt: string
}

export type TrafficServerSignal = {
  serverName: string
  rxMbps: number
  txMbps: number
  sampledAt: string
}

export type GreTunnelSignal = {
  /** Как в UI: `tunnelName / serverName` */
  targetLabel: string
  status: "up" | "down" | "degraded"
  /** Состояние на прошлом тике движка (из БД), для «восстановился». */
  prevStatus: "up" | "down" | "degraded" | null
}

export type BgpPeerSignal = {
  /** Как в UI: `serverName: peerName` */
  key: string
  state: string
  /** Состояние на прошлом тике (строка state с роутера). */
  prevState: string | null
}

export type SignalSnapshot = {
  sampledAt: string
  servers: ServerSignal[]
  probes: ProbeSignal[]
  trafficByServer: TrafficServerSignal[]
  greTunnels: GreTunnelSignal[]
  bgpSessions: BgpPeerSignal[]
}

export type RuleEvalHit = {
  ruleId: string
  ruleName: string
  severity: ApiAlertRule["severity"]
  message: string
  /** Тип перехода для диагностики и логики задержки отправки. */
  transition: "problem" | "recovery" | "neutral"
  /** Для дедупа */
  payloadHash: string
}

import type { AlertEngineRuleDiagSnapshot } from "../../types/scheduler-run-snapshot.js"

export type AlertEngineRuleDiag = AlertEngineRuleDiagSnapshot

export type AlertEngineRunResult = {
  sampledAt: string
  rulesChecked: number
  standaloneFires: number
  groupFires: number
  skippedNoTelegram: boolean
  errors: string[]
  ruleDiag: AlertEngineRuleDiag[]
}
