//! 回收站类 AI 工具声明式注册(register_trash_tools 1 个:list_trash 迁入)。
//!
//! 迁自 `tool_registry.rs::register_trash_tools`(原 1 个 list_trash),改用 `declare_tool!` 宏。
//!
//! 迁移策略(handler 逻辑零变更):
//! - handler body 逐字照搬原 `register_trash_tools` 内 async move 块(逻辑等价),
//!   仅闭包包装(`{ let db = db.clone(); Box::new(move |args| { let db = db.clone();
//!   Box::pin(async move { ... }) }) }`)改由 `declare_tool!` 宏生成。
//! - name/desc/schema/risk 与原手写定义逐字一致。
//! - 复用常量:MAX_LIST_RESULTS(super::tool_registry 单真相源)。
//!
//! 等价性验证:基线测试 `test_build_ai_tool_registry_baseline_tool_count` 仍断言 48 总量 +
//! 工具名集合稳定(防 rename / 漏注册)。

use std::sync::Arc;

use df_ai::ai_tools::{object_schema, AiToolRegistry, RiskLevel};
use df_ai::declare_tool;
use df_storage::db::Database;

use crate::commands::ai::tool_registry::MAX_LIST_RESULTS;

/// 注册 list_trash 工具到 `$registry`。
///
/// 与原手写 register(name, desc, schema, risk, handler) 语义 1:1:
/// - name/desc/schema 字符串与 JSON Schema 逐字照搬原定义
/// - risk=Low(只读)
/// - handler body 与原 async move 块逐字一致(逻辑零变更)
///
/// 唯一差异:闭包包装改由 `declare_tool!` 宏生成,handler body 直接写业务逻辑。
pub fn register(registry: &mut AiToolRegistry, db: &Arc<Database>) {
    declare_tool!(
        registry,
        db: Arc<Database>,
        "list_trash",
        "列出回收站已删除项目，支持 offset/limit 分页。返回 items、total、has_more。默认 limit=50",
        RiskLevel::Low,
        schema: object_schema(vec![("offset", "integer", false), ("limit", "integer", false)]),
        args => {
            let repo = df_storage::crud::ProjectRepo::new(&db);
            let items = repo.list_deleted().await?;
            let total = items.len();
            let offset = args["offset"].as_u64().unwrap_or(0) as usize;
            let limit = args["limit"].as_u64().unwrap_or(MAX_LIST_RESULTS as u64).min(MAX_LIST_RESULTS as u64) as usize;
            let page_items: Vec<_> = items.into_iter().skip(offset).take(limit).collect();
            let has_more = (offset + page_items.len()) < total;
            Ok(serde_json::json!({ "items": page_items, "total": total, "has_more": has_more }))
        }
    );
}
