use std::collections::{HashMap, HashSet};
use std::sync::Arc;
use cfait::context::TestContext;
use cfait::model::Task;
use cfait::store::TaskStore;
#[test]
fn test_blocking_index_basic() {
let ctx = Arc::new(TestContext::new());
let mut store = TaskStore::new(ctx);
let aliases: HashMap<String, Vec<String>> = HashMap::new();
let mut a = Task::new("Task A", &aliases, None);
a.uid = "A".to_string();
a.calendar_href = "cal1".to_string();
a.summary = "A".to_string();
let mut b = Task::new("Task B", &aliases, None);
b.uid = "B".to_string();
b.calendar_href = "cal1".to_string();
b.summary = "B".to_string();
b.dependencies.push("A".to_string());
let mut c = Task::new("Task C", &aliases, None);
c.uid = "C".to_string();
c.calendar_href = "cal1".to_string();
c.summary = "C".to_string();
c.dependencies.push("A".to_string());
store.add_task(a);
store.add_task(b);
store.add_task(c);
let blocking = store.get_tasks_blocking("A");
let uids: HashSet<String> = blocking.into_iter().map(|(uid, _)| uid).collect();
assert_eq!(uids.len(), 2, "A should block exactly 2 tasks initially");
assert!(uids.contains("B"), "A should block B");
assert!(uids.contains("C"), "A should block C");
let mut d = Task::new("Task D", &aliases, None);
d.uid = "D".to_string();
d.calendar_href = "cal1".to_string();
d.summary = "D".to_string();
store.add_task(d);
let before = store.get_tasks_blocking("A");
let before_uids: HashSet<String> = before.into_iter().map(|(uid, _)| uid).collect();
assert!(
!before_uids.contains("D"),
"D should not yet be blocked by A"
);
let added = store.add_dependency("D", "A".to_string());
assert!(
added.is_some(),
"add_dependency should return Some when adding new dependency"
);
let after = store.get_tasks_blocking("A");
let after_uids: HashSet<String> = after.into_iter().map(|(uid, _)| uid).collect();
assert_eq!(after_uids.len(), 3, "A should block 3 tasks after adding D");
assert!(after_uids.contains("D"), "A should now block D");
let removed = store.remove_dependency("B", "A");
assert!(
removed.is_some(),
"remove_dependency should return Some when dependency existed"
);
let final_blocking = store.get_tasks_blocking("A");
let final_uids: HashSet<String> = final_blocking.into_iter().map(|(uid, _)| uid).collect();
assert_eq!(
final_uids.len(),
2,
"After removing B->A there should be 2 blockers left"
);
assert!(
!final_uids.contains("B"),
"B should no longer be blocked by A"
);
assert!(final_uids.contains("C"), "C should still be blocked by A");
assert!(final_uids.contains("D"), "D should still be blocked by A");
}