use std::fs::{self, File};
use std::io::Write;
use tempfile::tempdir;
// 假设你的项目名在 Cargo.toml 中叫 mock_server
use mock_server::model::MockSource;
use mock_server::loader::MockLoader;

#[test]
fn test_config_deserialization() {
    // 测试 1：验证单接口 YAML 解析
    let single_yaml = r#"
        id: "auth_v1"
        request:
          method: "POST"
          path: "/api/v1/login"
        response:
          status: 200
          body: "inline_content"
    "#;
    let res: MockSource = serde_yaml::from_str(single_yaml).expect("应该成功解析单接口");
    assert_eq!(res.flatten().len(), 1);
    // assert_eq!(res.flatten()[0].id, "auth_v1");

    // 测试 2：验证多接口 YAML 数组解析
    let multi_yaml = r#"
        - id: "api_1"
          request: { method: "GET", path: "/1" }
          response: { status: 200, body: "b1" }
        - id: "api_2"
          request: { method: "GET", path: "/2" }
          response: { status: 200, body: "b2" }
    "#;
    let res_multi: MockSource = serde_yaml::from_str(multi_yaml).expect("应该成功解析接口数组");
    assert_eq!(res_multi.flatten().len(), 2);
}

#[test]
fn test_recursive_loading_logic() {
    // 创建临时 Mock 目录结构
    let root_dir = tempdir().expect("创建临时目录失败");
    let root_path = root_dir.path();

    // 构造物理层级：mocks/v1/user/
    let user_dir = root_path.join("v1/user");
    fs::create_dir_all(&user_dir).unwrap();

    // 在深层目录创建单接口文件
    let mut file1 = File::create(user_dir.join("get_profile.yaml")).unwrap();
    writeln!(
        file1,
        r#"
        id: "user_profile"
        request:
          method: "GET"
          path: "/api/v1/user/profile"
        response:
          status: 200
          body: "profile_data"
    "#
    )
    .unwrap();

    // 在根目录创建多接口文件
    let mut file2 = File::create(root_path.join("system.yaml")).unwrap();
    writeln!(
        file2,
        r#"
        - id: "sys_health"
          request: {{ method: "GET", path: "/health" }}
          response: {{ status: 200, body: "ok" }}
        - id: "sys_version"
          request: {{ method: "GET", path: "/version" }}
          response: {{ status: 200, body: "1.0.0" }}
    "#
    )
    .unwrap();
//     writeln!(
//         file2,
//         r#"
// - id: "sys_health"
//   request:
//     method: "GET"
//     path: "/health"
//   response:
//     status: 200
//     body: "ok"
// - id: "sys_version"
//   request:
//     method: "GET"
//     path: "/version"
//   response:
//     status: 200
//     body: "1.0.0"
// "#
//     )
//     .unwrap();

    // 执行加载
    let index = MockLoader::load_all_from_dir(root_path);

    // 断言结果：
    // 1. 检查 Key 是否根据路径首段正确提取（/api/v1/... -> api, /health -> health）
    assert!(index.contains_key("api"), "索引应包含 'api' 键");
    assert!(index.contains_key("health"), "索引应包含 'health' 键");
    assert!(index.contains_key("version"), "索引应包含 'version' 键");

    // 2. 检查规则总数
    let total_rules: usize = index.values().map(|v| v.len()).sum();
    assert_eq!(total_rules, 3, "总规则数应为 3");

    // 3. 检查深层文件是否被正确读取
    let api_rules = &index["api"];
    assert_eq!(api_rules[0].id, "user_profile");
}
