#!/usr/bin/env python3
"""Fail-closed hygiene audit for assembled Gac Mai Audio story JSON."""
from __future__ import annotations

import hashlib
import json
import re
import sys
from pathlib import Path

PLACEHOLDER_PATTERNS = {
    "paragraph_line_marker": re.compile(r"\bP\d+D\d+L\d+\b", re.I),
    "template_token": re.compile(r"\{\{[^{}]+\}\}|<<[^<>]+>>|\[\[(?:TODO|PLACEHOLDER|FILL)[^\]]*\]\]", re.I),
}
META_PATTERNS = {
    "part_label": re.compile(r"\bphần\s+\d+\b", re.I),
    "paragraph_label": re.compile(r"\bđoạn\s+\d+\b", re.I),
    "editorial_instruction": re.compile(r"\b(?:TODO|PLACEHOLDER|viết lại|chèn thêm|điền vào)\b", re.I),
}


def main(path: str) -> int:
    source = Path(path)
    raw = source.read_bytes()
    data = json.loads(raw)
    findings = []
    parts = data.get("parts", [])
    for part in parts:
        part_no = part.get("part")
        for index, paragraph in enumerate(part.get("paragraphs", []), 1):
            if not isinstance(paragraph, str):
                findings.append({"location": f"P{part_no}.{index}", "type": "non_string_paragraph"})
                continue
            for name, pattern in {**PLACEHOLDER_PATTERNS, **META_PATTERNS}.items():
                hits = pattern.findall(paragraph)
                if hits:
                    findings.append({"location": f"P{part_no}.{index}", "type": name, "hits": hits})
    result = {
        "status": "passed" if not findings else "failed",
        "story_sha256": hashlib.sha256(raw).hexdigest(),
        "parts": len(parts),
        "paragraphs": sum(len(p.get("paragraphs", [])) for p in parts),
        "findings": findings,
        "manual_listenability_review_required": True,
        "note": "A clean regex scan does not replace reading every changed paragraph and its inbound/outbound transitions aloud or as audio prose.",
    }
    print(json.dumps(result, ensure_ascii=False, indent=2))
    return 0 if not findings else 1


if __name__ == "__main__":
    if len(sys.argv) != 2:
        raise SystemExit("usage: audit_story_release_hygiene.py STORY.json")
    raise SystemExit(main(sys.argv[1]))
