use lean_ctx::core::knowledge::ProjectKnowledge;
use lean_ctx::core::memory_policy::MemoryPolicy;

#[test]
fn recall_rehydrates_from_archive_when_active_set_empty() {
    let _g = lean_ctx::core::data_dir::test_env_lock();
    let tmp = tempfile::tempdir().expect("tempdir");
    let data_dir = tmp.path().join("data");
    std::fs::create_dir_all(&data_dir).expect("mkdir");
    // TODO: Audit that the environment access only happens in single-threaded code.
    unsafe { std::env::set_var("LEAN_CTX_DATA_DIR", data_dir.to_string_lossy().to_string()) };

    let project_root = tmp.path().join("proj");
    std::fs::create_dir_all(&project_root).expect("mkdir proj");
    let project_root_str = project_root.to_string_lossy().to_string();

    // Create a fact that will be archived by lifecycle (low confidence).
    let policy = MemoryPolicy::default();
    let mut k = ProjectKnowledge::load_or_create(&project_root_str);
    k.remember("architecture", "db", "PostgreSQL", "s1", 0.1, &policy);
    let _ = k.run_memory_lifecycle(&policy);
    k.save().expect("save");

    // Now the active set should be empty (fact archived), so recall should rehydrate it.
    let out = lean_ctx::tools::ctx_knowledge::handle(
        &project_root_str,
        "recall",
        None,
        None,
        None,
        Some("db postgres"),
        "s1",
        None,
        None,
        None,
        None,
        None,
    );

    assert!(
        out.contains("architecture/db") || out.contains("PostgreSQL"),
        "expected rehydrated recall result, got: {out}"
    );

    // TODO: Audit that the environment access only happens in single-threaded code.
    unsafe { std::env::remove_var("LEAN_CTX_DATA_DIR") };
}
