/// FIST-Mbt store: 仓库抽象。
/// 迁移自 FIST(Python) 的双后端(SQLite/PG)设计理念:
/// 定义统一 Store trait,提供可插拔实现。当前交付内存实现(可运行测试、可作 demo),
/// SQLite 后端见 store_sqlite.mbt(Phase 2 落地)。

/// 仓库统一接口
pub trait Store {
  /// 创建任务;id 冲突返回错误
  create_task(Self, Task) -> Result[Unit, String]
  /// 按 id 读取
  get_task(Self, String) -> Option[Task]
  /// 全量更新任务
  update_task(Self, Task) -> Result[Unit, String]
  /// 列出全部任务(任意顺序)
  list_tasks(Self) -> Array[Task]
  /// 删除任务(ARCHIVING 清理用)
  delete_task(Self, String) -> Result[Unit, String]
  /// 清空(仅供测试 / reset)
  clear(Self) -> Unit
}

/// 内存实现:进程内 Map,简单可靠,配合单机 MCP server 足够。
pub struct MemoryStore {
  tasks : Map[String, Task]
}

pub fn MemoryStore::new() -> MemoryStore {
  { tasks: Map([]) }
}

impl Store for MemoryStore with create_task(self, task) {
  if self.tasks.contains(task.get_id()) {
    Err("task already exists: \{task.get_id()}")
  } else {
    self.tasks.set(task.get_id(), task)
    Ok(())
  }
}

impl Store for MemoryStore with get_task(self, id) {
  self.tasks.get(id)
}

impl Store for MemoryStore with update_task(self, task) {
  if !(self.tasks.contains(task.get_id())) {
    return Err("task not found: \{task.get_id()}")
  }
  self.tasks.set(task.get_id(), task)
  Ok(())
}

impl Store for MemoryStore with list_tasks(self) {
  let out : Array[Task] = []
  self.tasks.each(fn(_, t) { out.push(t) })
  out
}

impl Store for MemoryStore with delete_task(self, id) {
  if !(self.tasks.contains(id)) {
    Err("task not found: \{id}")
  } else {
    self.tasks.remove(id)
    Ok(())
  }
}

impl Store for MemoryStore with clear(self) {
  self.tasks.clear()
}

/// 提升声明:允许通过具体类型直接调用 trait 方法(避免 deprecated 隐式提升)。
pub extend MemoryStore with Store::{create_task, get_task, update_task, list_tasks, delete_task, clear}

/// 后端路由:内存版(默认,测试/演示)或 SQLite 持久化(运行时内建数据库)。
/// FistEngine 持此类型,业务层不感知具体后端。
pub enum StoreBackend {
  Mem(MemoryStore)
  Sql(SqliteStore)
}

impl Store for StoreBackend with create_task(self, task) {
  match self {
    Mem(m) => m.create_task(task)
    Sql(s) => s.create_task(task)
  }
}

impl Store for StoreBackend with get_task(self, id) {
  match self {
    Mem(m) => m.get_task(id)
    Sql(s) => s.get_task(id)
  }
}

impl Store for StoreBackend with update_task(self, task) {
  match self {
    Mem(m) => m.update_task(task)
    Sql(s) => s.update_task(task)
  }
}

impl Store for StoreBackend with list_tasks(self) {
  match self {
    Mem(m) => m.list_tasks()
    Sql(s) => s.list_tasks()
  }
}

impl Store for StoreBackend with delete_task(self, id) {
  match self {
    Mem(m) => m.delete_task(id)
    Sql(s) => s.delete_task(id)
  }
}

impl Store for StoreBackend with clear(self) {
  match self {
    Mem(m) => m.clear()
    Sql(s) => s.clear()
  }
}

pub extend StoreBackend with Store::{create_task, get_task, update_task, list_tasks, delete_task, clear}