#!/usr/bin/env python3
import hashlib
import json
import sys
from datetime import datetime, timezone
from pathlib import Path

PROJECT = Path(__file__).resolve().parents[1]
MANIFEST = PROJECT / "image/layout-manifest.json"
QA = PROJECT / "log/image-visual-qa.json"
REQUIRED = {
    "image/intro-poster-master.png",
    "image/left-panel-master.png",
    "image/right-panel-master.png",
    "image/intro-poster-1920x1080.png",
    "image/layout-1920x1080.png",
}


def sha(path):
    return hashlib.sha256(path.read_bytes()).hexdigest()


def main():
    if not MANIFEST.is_file() or not QA.is_file():
        raise RuntimeError("layout manifest or explicit visual QA receipt missing")
    manifest = json.loads(MANIFEST.read_text(encoding="utf-8"))
    qa = json.loads(QA.read_text(encoding="utf-8"))
    rows = qa.get("assets", [])
    by_path = {row.get("path"): row for row in rows}
    issues = []
    for rel in REQUIRED:
        path = PROJECT / rel
        row = by_path.get(rel, {})
        if not path.is_file():
            issues.append("missing:" + rel)
            continue
        if row.get("verified") is not True or row.get("sha256") != sha(path):
            issues.append("qa_or_hash:" + rel)
        for gate in ("text_exact", "accents_correct", "readable", "uncropped", "no_extra_text", "composition_matches_brief"):
            if row.get("checks", {}).get(gate) is not True:
                issues.append(gate + ":" + rel)
    if qa.get("provider_rendered_text_only") is not True or qa.get("video_frame_inspected") is not False:
        issues.append("qa_policy")
    verified = not issues
    manifest["visual_qa"] = {
        "required": True,
        "status": "passed" if verified else "failed",
        "verified": verified,
        "receipt": str(QA.relative_to(PROJECT)),
        "receipt_sha256": sha(QA),
        "issues": issues,
        "checked_at": datetime.now(timezone.utc).isoformat(),
    }
    MANIFEST.write_text(json.dumps(manifest, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
    print(json.dumps({"verified": verified, "issues": issues}, ensure_ascii=False))
    return 0 if verified else 1


if __name__ == "__main__":
    try:
        sys.exit(main())
    except Exception as exc:
        print(f"Image QA finalization blocked: {exc}", file=sys.stderr)
        sys.exit(1)
