"""Offline portfolio companion. Fictional corpus; no LLM or external calls.

Run: python knowledge-assistant.py
Rebuild the displayed fixture: python knowledge-assistant.py --write
This extractive baseline demonstrates retrieval, attribution and a review gate.
"""

import json
import re
import sys
from pathlib import Path

ROOT = Path(__file__).resolve().parent
STOPWORDS = {"a", "an", "and", "the", "is", "what", "should", "must", "include",
             "of", "to", "in", "for", "be", "it"}


def tokens(text):
    return set(re.findall(r"[a-z0-9]+", text.lower())) - STOPWORDS


def validate(result, retrieved):
    """Reject invented citations, changed extracts and an incorrect review gate."""
    sources = {doc["id"]: doc for doc in retrieved}
    if result["review_required"] is not True:
        raise ValueError("Human review must remain required")
    if result["status"] != ("draft_for_review" if retrieved else "insufficient_evidence"):
        raise ValueError("Status must reflect available evidence")
    if len(result["evidence"]) != len(sources):
        raise ValueError("Output must include exactly the retrieved sources")
    seen = set()
    for item in result["evidence"]:
        source = sources.get(item["source_id"])
        if not source or item["source_id"] in seen or item["text"] != source["text"]:
            raise ValueError("Unverified or duplicate source content")
        seen.add(item["source_id"])


def answer(question, corpus):
    query = tokens(question)
    ranked = sorted(
        ((len(query & tokens(doc["title"] + " " + doc["text"])), doc) for doc in corpus),
        key=lambda item: (-item[0], item[1]["id"]),
    )
    # Two shared non-stopword terms; deliberately simple, inspectable baseline.
    retrieved = [doc for score, doc in ranked if score >= 2][:2]
    result = {
        "question": question,
        "status": "draft_for_review" if retrieved else "insufficient_evidence",
        "evidence": [{"source_id": doc["id"], "text": doc["text"]} for doc in retrieved],
        "review_required": True,
        "next_action": "Review the cited guidance against the question before use."
        if retrieved else "Request an authoritative source; do not infer the missing policy.",
    }
    validate(result, retrieved)
    return result


if __name__ == "__main__":
    corpus = json.loads((ROOT / "knowledge-corpus.json").read_text(encoding="utf-8"))
    questions = json.loads((ROOT / "knowledge-questions.json").read_text(encoding="utf-8"))
    output = json.dumps([answer(question, corpus) for question in questions], indent=2) + "\n"
    if "--write" in sys.argv:
        (ROOT / "knowledge-output.json").write_text(output, encoding="utf-8")
    else:
        print(output, end="")
