/// src/engine/docs_gate.mbt — 「文档即实现」验收门禁(可选开关,默认关闭)。
///
/// 把「文档-交付物一致性」从口头习惯升格为 verify 前的可选门禁:
/// 复用 @omega.check_structure(project_dir) 校验 README.md/CHANGELOG.md/reports 存在,
/// 用 @omega.check_report_format(deliverable) 校验回传五段式。
/// 任一未达标 → Err(含 item:detail 明细) 即打回 reason。与 omega_verify_gate /
/// gate_verify_gate 同构:仅在显式开启时生效,默认 Ok 不回归。

///|
/// 仅提取 check 结果里 passed=false 的失败明细,拼接成人语可读的错误文案。
/// 返回失败段数组(如全过则空)。
fn collect_failures(results : Array[Json]) -> Array[String] {
  let out : Array[String] = []
  for j in results {
    let mut item = ""
    let mut detail = ""
    match j {
      Object(m) => {
        item = match m.get("item") {
          Some(String(s)) => s
          _ => ""
        }
        detail = match m.get("detail") {
          Some(String(s)) => s
          _ => ""
        }
      }
      _ => ()
    }
    // 判定 passed:默认失败,仅当字段存在且为 true 才算过
    let ok = match j {
      Object(m) =>
        match m.get("passed") {
          Some(True) => true
          _ => false
        }
      _ => false
    }
    if !ok {
      out.push("\{item}: \{detail}")
    }
  }
  out
}

///|
/// 「文档即实现」验收门禁:task 需为 [docs:required] 或显式传 docs_check=true 时生效。
/// 校验结构与回传格式,任一项缺失/不达标 → Err(含明细)。
pub fn FistEngine::docs_verify_gate(
  self : FistEngine,
  task_id : String,
) -> Result[Unit, String] {
  let t = match self.store.get_task(task_id) {
    None => return Err("task not found: \{task_id}")
    Some(x) => x
  }
  let fail_buf : Array[String] = []
  // 1) 项目结构(README.md / CHANGELOG.md / reports/ 存在性)
  let proj = t.project_dir
  if proj.is_empty() {
    fail_buf.push("project_dir 为空,无法校验项目结构")
  } else {
    let struct_res = @omega.check_structure(proj)
    let f1 = collect_failures(struct_res)
    for x in f1 {
      fail_buf.push(x)
    }
  }
  // 2) 交付物回传五段式
  let dlv = t.deliverable
  let fmt_res = @omega.check_report_format(dlv)
  let f2 = collect_failures(fmt_res)
  for x in f2 {
    fail_buf.push(x)
  }
  if fail_buf.is_empty() {
    Ok(())
  } else {
    Err("文档一致性门禁未通过:\{fail_buf.join(";")}")
  }
}