// ===== observer 命令契约(shared——typed commands 词形)=====
// 词形对位 observer-ui FetchPort 视图模型(ProcessRow/MemorySummary——
// etop_proc_info 七字段谱键映射;ToJson/FromJson derive 契约化——
// frontend/backend 双端同形)

///|
/// 进程行(pid 标识+name+内存+消息队列长——五键简化路 v2)
#derive(ToJson, FromJson, Eq, Debug)
pub(all) struct ProcessRow {
  pid : String
  name : String
  memory_bytes : Int32
  message_queue_len : Int32
  reductions : Int32
}

///|
pub extend ProcessRow with ToJson::{to_json}

///|
pub extend ProcessRow with FromJson::{from_json}

///|
pub extend ProcessRow with Eq::{not_equal, equal}

///|
pub extend ProcessRow with Debug::{to_repr}

///|
/// 内存摘要(erlang:memory() 词对四键摘)
#derive(ToJson, FromJson, Eq, Debug)
pub(all) struct MemorySummary {
  total : Int32
  processes : Int32
  ets : Int32
  atom : Int32
}

///|
pub extend MemorySummary with ToJson::{to_json}

///|
pub extend MemorySummary with FromJson::{from_json}

///|
pub extend MemorySummary with Eq::{not_equal, equal}

///|
pub extend MemorySummary with Debug::{to_repr}

///|
/// ETS 表行(表名+大小——骨架形)
#derive(ToJson, FromJson, Eq, Debug)
pub(all) struct EtsRow {
  name : String
  size : Int32
}

///|
pub extend EtsRow with ToJson::{to_json}

///|
pub extend EtsRow with FromJson::{from_json}

///|
pub extend EtsRow with Eq::{not_equal, equal}

///|
pub extend EtsRow with Debug::{to_repr}

///|
/// 端口摘要(端口数+端口名清单——骨架形)
#derive(ToJson, FromJson, Eq, Debug)
pub(all) struct PortSummary {
  count : Int32
  names : Array[String]
}

///|
pub extend PortSummary with ToJson::{to_json}

///|
pub extend PortSummary with FromJson::{from_json}

///|
pub extend PortSummary with Eq::{not_equal, equal}

///|
pub extend PortSummary with Debug::{to_repr}

///|
/// 观察器快照(五面拉全链载荷——refresh 编排对位)
#derive(ToJson, FromJson, Eq, Debug)
pub(all) struct ObserverSnapshot {
  process_rows : Array[ProcessRow]
  memory : MemorySummary
  ets_rows : Array[EtsRow]
  ports : PortSummary
}

///|
pub extend ObserverSnapshot with ToJson::{to_json}

///|
pub extend ObserverSnapshot with FromJson::{from_json}

///|
pub extend ObserverSnapshot with Eq::{not_equal, equal}

///|
pub extend ObserverSnapshot with Debug::{to_repr}

///|
/// 命令请求形(观察器五词——node 指示+空载荷形)
#derive(ToJson, FromJson, Eq, Debug)
pub(all) struct NodeRequest {
  node : String
}

///|
pub extend NodeRequest with ToJson::{to_json}

///|
pub extend NodeRequest with FromJson::{from_json}

///|
pub extend NodeRequest with Eq::{not_equal, equal}

///|
pub extend NodeRequest with Debug::{to_repr}

///|
/// 命令描述符五词(proton_contract.Command[Request, Reply] 形——
/// 照 todo_contract list_todos 形;backend registrar.bind 对位)
pub let fetch_processes : @proton_contract.Command[
  NodeRequest,
  Array[ProcessRow],
] = @proton_contract.command("fetch_processes")

///|
pub let fetch_memory : @proton_contract.Command[NodeRequest, MemorySummary] = @proton_contract.command(
  "fetch_memory",
)

///|
pub let fetch_ets : @proton_contract.Command[NodeRequest, Array[EtsRow]] = @proton_contract.command(
  "fetch_ets",
)

///|
pub let fetch_ports : @proton_contract.Command[NodeRequest, PortSummary] = @proton_contract.command(
  "fetch_ports",
)

///|
pub let fetch_snapshot : @proton_contract.Command[NodeRequest, ObserverSnapshot] = @proton_contract.command(
  "fetch_snapshot",
)

///|
/// 视图错误(数据面诚实拒——ShapeMismatch 形;frontend/backend 双端同形)
#derive(ToJson, FromJson, Eq, Debug)
pub(all) suberror ViewError {
  ShapeMismatch(String)
}

///|
pub extend ViewError with ToJson::{to_json}

///|
pub extend ViewError with Debug::{to_repr}

///|
pub extend ViewError with @moonbitlang/core/json.FromJson::{from_json}

///|
pub extend ViewError with Eq::{not_equal, equal}