from __future__ import annotations

import csv
from pathlib import Path


def read_csv(name: str) -> list[dict[str, str]]:
    with Path("data", name).open(newline="", encoding="utf-8") as handle:
        return list(csv.DictReader(handle))


def main() -> None:
    requirements = read_csv("requirements.csv")
    evidence = read_csv("evidence.csv")
    links = read_csv("trace_links.csv")
    req_ids = {row["requirement_id"] for row in requirements}
    evidence_ids = {row["evidence_id"] for row in evidence}
    coverage = {req_id: [] for req_id in req_ids}
    orphan_evidence = set(evidence_ids)
    for link in links:
        assert link["source_id"] in req_ids, f"unknown requirement {link['source_id']}"
        assert link["target_id"] in evidence_ids, f"unknown evidence {link['target_id']}"
        coverage[link["source_id"]].append(link["target_id"])
        orphan_evidence.discard(link["target_id"])
    uncovered = sorted(req_id for req_id, targets in coverage.items() if not targets)
    print("coverage =", {key: sorted(value) for key, value in sorted(coverage.items())})
    print("uncovered_requirements =", uncovered)
    print("orphan_evidence =", sorted(orphan_evidence))
    assert uncovered == ["REQ-CLEARANCE"]
    assert sorted(orphan_evidence) == ["EV-NOTE-01"]


if __name__ == "__main__":
    main()
