// ===== Observer 视图模型纯核(数据面——rpc:call 应答形状的规约面)=====
// 职责:rpc 应答(beam-rpc EtfVal)→面板视图模型(进程表/树/ETS/内存/端口)。
// 渲染(MoUI)藏 RenderPort trait 后——数据面纯核,渲染位组合根装配。

///|
pub(all) suberror ViewError {
  ShapeMismatch(String) // rpc 应答形不符(规约面诚实拒)
}

///|
/// 进程行(pid 标识+name+初始函数+内存+消息队列长)
pub(all) struct ProcessRow {
  pid : String
  name : String
  initial_call : String
  memory_words : Int32
  message_queue_len : Int32
}

///|
/// ETS 表行(表名+类型+大小)
pub(all) struct EtsRow {
  name : String
  kind : String // set/ordered_set/bag/duplicate_bag
  size : Int32
}

///|
/// sup 树节点(子项 id+类型+子树)
pub(all) struct SupNode {
  name : String
  children : Array[SupChild]
}

///|
pub(all) struct SupChild {
  child_id : String
  kind : String // worker/supervisor
}

///|
/// 内存摘要(total/processes/ets/atom——词对应 erlang:memory() 键)
pub(all) struct MemorySummary {
  mut total : Int32
  mut processes : Int32
  mut ets : Int32
  mut atom : Int32
}

///|
/// 渲染注入位(MoUI 组合根实现;数据面纯核零渲染依赖)
pub(open) trait RenderPort {
  fn render_processes(self : Self, rows : Array[ProcessRow]) -> Unit
  fn render_ets(self : Self, rows : Array[EtsRow]) -> Unit
  fn render_sup_tree(self : Self, tree : SupNode) -> Unit
  fn render_memory(self : Self, mem : MemorySummary) -> Unit
  fn render_ports(self : Self, count : Int32) -> Unit
}

///|
/// 视图模型:承载 rpc 客户端注入(beam-rpc call 面)的快照拉取编排位
pub struct Observer {
  fetch : &FetchPort
}

///|
/// 构造(生产面 API——组合根装配位)
pub fn Observer::new(fetch~ : &FetchPort) -> Observer {
  { fetch, }
}

///|
/// FetchPort(数据源注入位——beam-rpc call 组合;观察器不直摸 rpc 词)
pub(open) trait FetchPort {
  // 进程信息(erlang:processes()+process_info 摘要——骨架形:行文本列)
  // async 契约(beam-rpc RpcPort async 同形——色随 trait 声明)
  async fn fetch_processes(self : Self) -> Array[ProcessRow] raise ViewError
  // ETS 表清单(ets:all()+info 形)
  async fn fetch_ets(self : Self) -> Array[EtsRow] raise ViewError
  // sup 树(supervisor:which_children 递归——骨架形:单层)
  async fn fetch_sup_tree(self : Self, sup : String) -> SupNode raise ViewError
  // 内存摘要(erlang:memory() 词对)
  async fn fetch_memory(self : Self) -> MemorySummary raise ViewError
  // 端口计数(erlang:ports() 长)
  async fn fetch_ports(self : Self) -> Int32 raise ViewError
}

///|
/// 面板全量刷新(编排:五 fetch→五 render——段段透传,零静默吞错)
pub async fn Observer::refresh(
  self : Observer,
  render : &RenderPort,
) -> Unit raise ViewError {
  render.render_processes(self.fetch.fetch_processes())
  render.render_ets(self.fetch.fetch_ets())
  render.render_sup_tree(self.fetch.fetch_sup_tree("kernel_sup"))
  render.render_memory(self.fetch.fetch_memory())
  render.render_ports(self.fetch.fetch_ports())
}