/// 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
} 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"
  }
}

pub fn Role::from_string(s : String) -> Option[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)
    _ => None
  }
}

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

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

/// 每个任务的完整操作清单
pub enum Action {
  Publish         // 发布根任务
  Dispatch        // 分发/拆分
  Search          // 信息检索
  Allocate        // 分配执行者
  Claim           // 认领任务
  Execute         // 执行任务
  Submit          // 提交验收
  Verify          // 验收
  Complete        // 标记完成(人类 ONLY)
  Archive         // 归档(人类 ONLY)
  Reopen          // 重新打开
  Observe         // 只读查看
  ManageProject   // 项目管理
} derive(Eq, Debug)

/// 权限判定:Can(HumanSteward, 任意) = true;
/// 非人类角色只能做自己职责内的非破坏性动作。
pub fn can(role : Role, action : Action) -> Bool {
  match (role, action) {
    (HumanSteward, _) => true
    (Leader, Publish) => true
    (Leader, Dispatch) => true
    (Leader, Allocate) => true
    (Leader, Claim) => true
    (Leader, Execute) => true
    (Leader, Submit) => true
    (Leader, Observe) => true
    (Leader, ManageProject) => true
    (Searcher, Search) => true
    (Searcher, Observe) => true
    (Allocator, Allocate) => true
    (Allocator, Observe) => true
    (Executor, Claim) => true
    (Executor, Execute) => true
    (Executor, Submit) => true
    (Executor, Observe) => true
    (Verifier, Verify) => true
    (Verifier, Observe) => true
    (Recorder, Observe) => true
    (Observer, Observe) => 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()}]",
    )
  }
}

/// Action 可读名(供错误消息)
pub fn Action::to_string(self : Action) -> String {
  match self {
    Publish => "publish"
    Dispatch => "dispatch"
    Search => "search"
    Allocate => "allocate"
    Claim => "claim"
    Execute => "execute"
    Submit => "submit"
    Verify => "verify"
    Complete => "complete"
    Archive => "archive"
    Reopen => "reopen"
    Observe => "observe"
    ManageProject => "manage_project"
  }
}

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