#!/usr/bin/env python3
"""Synthetic artifact-boundary replay. Pass a pinned play-policy-insights directory."""
import contextlib
import hashlib
import importlib.util
import io
import json
from pathlib import Path
import subprocess
import sys
import tempfile

ROOT = Path(sys.argv[1]).resolve()
HASHES = {
    "scripts/generate_report.py": "66a3536cf206ab883307c9410ff2154798f1f207b366d6b3ea562b60223c33c7",
    "scripts/play_store_scraper.py": "1a7cfce2b04659ec5d003ccaebf2dc6b57b9280fadb287e31dc7cf50fbea92eb",
    "scripts/template_engine.py": "766140144502ff1f3f84749df2fc93f634da0b9aa3160054eae8f5f922f5e467",
    "resources/compliance_report_template.md": "fedf8de0653f5887c2bfb0b6952c5fb8591b2fbfdae8a6c24c152707a79d3d2a",
    "resources/policies.json": "acb66e054c7cad6f0c9b230573fe16a28dd8d168d0499a105fcaf3f80c95f5fa",
}
for name, expected in HASHES.items():
    assert hashlib.sha256((ROOT / name).read_bytes()).hexdigest() == expected, name
sys.path.insert(0, str(ROOT / "scripts"))
spec = importlib.util.spec_from_file_location("report_under_test", ROOT / "scripts/generate_report.py")
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)

def write(path, data):
    path.write_text(json.dumps(data), encoding="utf-8")

def fixture(path, severity="CRITICAL"):
    write(path / "play_store_info.json", {"is_published": False, "title": "Synthetic fixture"})
    write(path / "aggregated_findings.json", {"findings": [{
        "finding_id": "1", "policy_id": "SYNTHETIC", "severity": severity,
        "issue_summary": "Synthetic finding, not a real policy violation",
        "files_involved": ["synthetic/App.kt:1"], "evidence": "Synthetic evidence",
        "recommendation": "Synthetic recommendation",
    }]})

def check(name, severity="CRITICAL", critic=None, expected=("Non-compliant", 1, 0), fallback=True):
    with tempfile.TemporaryDirectory() as temp:
        path = Path(temp)
        fixture(path, severity)
        if critic is not None:
            (path / "critic_output_0.json").write_text(critic, encoding="utf-8")
        err = io.StringIO()
        with contextlib.redirect_stderr(err):
            report = module.aggregate_findings(temp, {})
        got = (report["overall_compliance"], len(report["identified_risks"]), len(report["manual_review_needed"]))
        assert got == expected, (name, got)
        if fallback:
            assert "Automatically verified (bypassed critic review). (Confidence: High)" in report["identified_risks"][0]["evidence"]
        elif report["identified_risks"]:
            evidence = report["identified_risks"][0]["evidence"]
            assert "Automatically verified" not in evidence
            assert "Controlled fixture verdict (Confidence: Low)" in evidence
        if name == "malformed":
            assert "Warning" in err.getvalue()
        print(f"{name}: status={got[0]}; risks={got[1]}; manual={got[2]}; fallback_high={fallback}")

print("Python " + sys.version.split()[0])
for name, critic in [("absent", None), ("malformed", "{"), ("missing-id", '{"2":{"action":"PRUNED"}}'), ("empty-decision", '{"1":{}}')]:
    check(name, critic=critic)
check("suggestion", severity="SUGGESTION", expected=("Compliant", 1, 0))
check("important", severity="IMPORTANT", expected=("Needs review", 1, 0))
check("explicit-verified", critic='{"1":{"action":"VERIFIED","confidence":"Low","critic_justification":"Controlled fixture verdict"}}', fallback=False)
check("explicit-manual", critic='{"1":{"action":"MANUAL_REVIEW"}}', expected=("Needs review", 0, 1), fallback=False)
check("explicit-pruned", critic='{"1":{"action":"PRUNED"}}', expected=("Compliant", 0, 0), fallback=False)

with tempfile.TemporaryDirectory() as temp:
    path = Path(temp)
    fixture(path)
    result = subprocess.run([sys.executable, str(ROOT / "scripts/generate_report.py"), temp], capture_output=True, text=True)
    assert result.returncode == 0, result.stderr
    report = json.loads((path / "compliance_report.json").read_text())
    markdown = (path / "compliance_report.md").read_text()
    assert "Automatically verified (bypassed critic review). (Confidence: High)" in report["findings"][0]["evidence"]
    assert "Confidence: High" in markdown
    print("generator-cli: exit=0; JSON fallback_high=True; Markdown fallback_high=True")
print("PASS: 9 aggregate cases and 1 generator CLI case")
