// ===== node_supervisor:节点事件决策面(blueprint: moonactor 门 C 第二件移植)=====
// 职责:消费 NodeEvents.on_nodedown→按策略落决策账。
// 真源对位:net_kernel dist_auto_connect(once/never)+restart_distr(kernel_sup
// 重启 net_sup 的监督重启形);决策词沿 ADR 降级梯(reconnect/degrade)。
// 层次:节点层不含监督语义的实现——本件只有"策略查表+决策记录",
// 重连的执行面(EPMD+握手重放)由上层组装(双实现安放律:身份=节点事件决策者)。

///|
/// 自动重连策略(net_kernel dist_auto_connect 对位)
pub(all) enum AutoConnect {
  Once // 下线后允许重连(reconnect 决策)
  Never // 下线即降级(degrade 决策——权柄交回上游)
}

///|
/// 节点监督者:impl NodeEvents(订阅面)——事件入账+按策略出决策
pub struct NodeSupervisor {
  priv policy : AutoConnect
  priv decisions : Array[String] // 决策账(reconnect/degrade 时序页)
  priv mut down_n : Int32 // nodedown 事件计数
}

///|
pub fn NodeSupervisor::new(
  policy~ : AutoConnect = AutoConnect::Once,
) -> NodeSupervisor {
  { policy, decisions: [], down_n: 0, }
}

///|
/// 决策账(罐测断言用;只读——页形 "node:reconnect|degrade")
pub fn NodeSupervisor::decisions(self : NodeSupervisor) -> Array[String] {
  self.decisions
}

///|
/// nodedown 事件计数
pub fn NodeSupervisor::down_count(self : NodeSupervisor) -> Int32 {
  self.down_n
}

///|
/// nodedown 决策(常规方法真体——晋升面收口:impl 与它同名即撞名保护,
/// 零隐式晋升告警;订阅面/罐直调走此面)
pub fn NodeSupervisor::on_nodedown(
  self : NodeSupervisor,
  node : String,
) -> Unit {
  self.down_n = self.down_n + 1
  let decision = match self.policy {
    Once => "reconnect"
    Never => "degrade"
  }
  let _ = self.decisions.push("\{node}:\{decision}")
}

///|
/// NodeEvents impl(委托常规方法——方法调用分派走 inherent 撞名保护,
/// 不会递归回 impl 臂)
pub impl NodeEvents for NodeSupervisor with fn on_nodedown(self, node : String) -> Unit {
  self.on_nodedown(node)
}