/// FIST-Mbt core: 八角色定义与权限矩阵。
/// 迁移自 FIST(Python) 的角色体系,用强类型把「谁能对谁做什么」编译期固定下来。

///|
/// 八角色
pub enum Role {
  /// 人类指挥官(唯一拥有任务的最终主权)
  HumanSteward
  /// 任务编排/拆分管家的执行代理(对应 executor)
  Leader
  /// 作战信息搜集(searcher)
  Searcher
  /// 资源分配(allocator)
  Allocator
  /// 执行者(executor)
  Executor
  /// 验收者(verifier / omega-verify)
  Verifier
  /// 记录者(recorder / logger)
  Recorder
  /// 观测者(observer)
  Observer
  /// 语料创建者(Omega 强验证:为本轮任务编写 Omega 语料)
  SpecAuthor
} derive(Eq, Debug)

///|
pub fn Role::to_string(self : Role) -> String {
  match self {
    HumanSteward => "human_steward"
    Leader => "leader"
    Searcher => "searcher"
    Allocator => "allocator"
    Executor => "executor"
    Verifier => "verifier"
    Recorder => "recorder"
    Observer => "observer"
    SpecAuthor => "spec_author"
  }
}

///|
pub fn Role::from_string(s : String) -> Role? {
  match s {
    "human_steward" => Some(HumanSteward)
    "leader" => Some(Leader)
    "searcher" => Some(Searcher)
    "allocator" => Some(Allocator)
    "executor" => Some(Executor)
    "verifier" => Some(Verifier)
    "recorder" => Some(Recorder)
    "observer" => Some(Observer)
    "spec_author" => Some(SpecAuthor)
    _ => None
  }
}

///|
/// 角色职责说明
pub fn Role::description(self : Role) -> String {
  match self {
    HumanSteward =>
      "人类指挥官:发布根任务、验收 ONLY、归档 ONLY,唯一主权"
    Leader =>
      "领队:拆解任务、编排调度、把子任务分配给执行者"
    Searcher =>
      "搜证:信息检索、可行性调研、为任务提供依据"
    Allocator =>
      "资源分配:分配执行者与资源,保证负载可执行"
    Executor => "执行者:认领任务、动手实现、产出交付物"
    Verifier =>
      "验收者:运行验证(omega-verify),必要时调用人类"
    Recorder => "记录者:日志、进度、档案记录(observability)"
    Observer => "观测者:只读看板、审计、权限追踪,不落子"
    SpecAuthor =>
      "语料创建者:Omega 强验证开关开启时,为本轮任务编写语料(spec),交由验证者审核"
  }
}

/// —— 权限矩阵:role 是否可以执行 action ——
/// 这是 FIST 「任务主权/权限分离」原则(七条第 5 条衍生)的静态表达。
/// HumanSteward 拥有最高权限(唯一人类,可裁决一切)。

///|
/// 每个任务的完整操作清单(仅保留 Omega 强验证相关 Action)
pub enum Action {
  CreateSpec // 创建语料(Omega 强验证:语料创建者)
  ReviewSpec // 审核语料 / 复验成果(Omega 强验证:验证者)
} derive(Eq, Debug)

///|
/// 权限判定:Can(HumanSteward, 任意) = true;
/// 非人类角色只能做自己职责内的非破坏性动作。
pub fn can(role : Role, action : Action) -> Bool {
  match (role, action) {
    (HumanSteward, _) => true
    (SpecAuthor, CreateSpec) => true
    (Verifier, ReviewSpec) => true
    _ => false
  }
}

///|
/// 权限校验函数(带可读错误消息)
pub fn ensure_can(role : Role, action : Action) -> Result[Unit, String] {
  if can(role, action) {
    Ok(())
  } else {
    Err(
      "权限不足: [\{role.to_string()}] 无权执行 [\{action.to_string()}]",
    )
  }
}

///|
/// Omega 强验证:语料创建权校验(供 engine 包调用,避免跨包构造枚举值)
pub fn ensure_can_create_spec(actor : String) -> Result[Unit, String] {
  match role_of(actor) {
    Ok(r) => ensure_can(r, CreateSpec)
    Err(e) => Err(e)
  }
}

///|
/// Omega 强验证:语料审核 / 成果复验权校验
pub fn ensure_can_review_spec(actor : String) -> Result[Unit, String] {
  match role_of(actor) {
    Ok(r) => ensure_can(r, ReviewSpec)
    Err(e) => Err(e)
  }
}

///|
/// Action 可读名(供错误消息)
pub fn Action::to_string(self : Action) -> String {
  match self {
    CreateSpec => "create_spec"
    ReviewSpec => "review_spec"
  }
}

///|
/// 从字符串解析角色(MCP 参数用)
pub fn role_of(s : String) -> Result[Role, String] {
  match Role::from_string(s) {
    Some(r) => Ok(r)
    None => Err("未知角色: '\{s}'")
  }
}