#!/usr/bin/env python3
import hashlib
import json
import subprocess
import sys
from pathlib import Path

PROJECT = Path(__file__).resolve().parents[1]
VALIDATOR = PROJECT / "script/validate-production.py"
REPORT = PROJECT / "log/production-verification.json"
FINAL = PROJECT / "output/final.mp4"
UPLOAD = PROJECT / "output/final-upload.mp4"
TRANS = PROJECT / "log/upload-transcode.json"
META = PROJECT / "output/info.txt"


def sha(path):
    digest = hashlib.sha256()
    with path.open("rb") as handle:
        for block in iter(lambda: handle.read(8 * 1024 * 1024), b""):
            digest.update(block)
    return digest.hexdigest()


def main():
    copy_gate = subprocess.run([sys.executable, str(PROJECT / "script/validate-workflow-copy.py"), "full"], cwd=PROJECT)
    if copy_gate.returncode:
        raise RuntimeError("workflow-copy authority gate failed")
    result = subprocess.run([sys.executable, str(VALIDATOR)], cwd=PROJECT)
    if result.returncode:
        return result.returncode
    if not all(path.exists() for path in (REPORT, FINAL, UPLOAD, TRANS, META)):
        raise SystemExit("Publish blocked: artifacts missing")
    report = json.loads(REPORT.read_text())
    trans = json.loads(TRANS.read_text())
    server = trans.get("server_verification", {})
    valid = (
        report.get("verified") is True
        and trans.get("verified") is True
        and trans.get("status") == "completed"
        and trans.get("source_canon_sha256") == report.get("source_canon_sha256")
        and trans.get("output_sha256") == sha(UPLOAD)
        and server.get("verified") is True
        and server.get("under_one_gb") is True
        and trans.get("visual_qa", {}).get("required") is False
        and int(server.get("output_bytes", 0)) == UPLOAD.stat().st_size
        and UPLOAD.stat().st_size < 1_000_000_000
    )
    if not valid:
        raise SystemExit("Publish blocked: upload copy hash/size/visual QA mismatch")
    print(json.dumps({"publish_ready": True, "source_canon_sha256": report["source_canon_sha256"], "master_video": str(FINAL), "video": str(UPLOAD), "video_bytes": UPLOAD.stat().st_size, "transcode_job_id": trans["job_id"], "metadata": str(META)}, ensure_ascii=False))
    return 0


if __name__ == "__main__":
    sys.exit(main())
