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

PROJECT = Path(__file__).resolve().parents[1]
IMAGE = PROJECT / "image" / "v3"
GENERATION = PROJECT / "log" / "v3" / "image-generation.json"
BRIEF = IMAGE / "image-brief.json"
MANIFEST = IMAGE / "layout-manifest.json"


def probe(path):
    result = subprocess.run(
        ["ffprobe", "-v", "error", "-select_streams", "v:0", "-show_entries", "stream=width,height,codec_name", "-of", "json", str(path)],
        capture_output=True,
        text=True,
        check=True,
    )
    return json.loads(result.stdout)["streams"][0]


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


def run(command):
    subprocess.run(command, check=True)


def main():
    if not GENERATION.exists() or not BRIEF.exists():
        print("Layout blocked: v3 image generation receipt or brief missing", file=sys.stderr)
        return 1
    generation = json.loads(GENERATION.read_text(encoding="utf-8"))
    brief = json.loads(BRIEF.read_text(encoding="utf-8"))
    canon_hash = brief.get("source_canon_sha256")
    if generation.get("verified") is not True or generation.get("source_canon_sha256") != canon_hash:
        print("Layout blocked: image receipt not verified or canon hash mismatched", file=sys.stderr)
        return 1

    poster_master = IMAGE / "intro-poster-master.png"
    left_master = IMAGE / "left-panel-master.png"
    right_master = IMAGE / "right-panel-master.png"
    for path in (poster_master, left_master, right_master):
        if not path.exists() or path.stat().st_size < 100000:
            print(f"Layout blocked: missing image master {path}", file=sys.stderr)
            return 1

    poster = IMAGE / "intro-poster-1920x1080.png"
    left = IMAGE / "left-panel-656x1080.png"
    right = IMAGE / "right-panel-656x1080.png"
    layout = IMAGE / "layout-1920x1080.png"

    run(["ffmpeg", "-hide_banner", "-loglevel", "error", "-y", "-i", str(poster_master), "-vf", "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2:color=#101820", "-frames:v", "1", str(poster)])
    run(["ffmpeg", "-hide_banner", "-loglevel", "error", "-y", "-i", str(left_master), "-vf", "scale=656:1080:force_original_aspect_ratio=decrease,pad=656:1080:(ow-iw)/2:(oh-ih)/2:color=#101820", "-frames:v", "1", str(left)])
    run(["ffmpeg", "-hide_banner", "-loglevel", "error", "-y", "-i", str(right_master), "-vf", "scale=656:1080:force_original_aspect_ratio=decrease,pad=656:1080:(ow-iw)/2:(oh-ih)/2:color=#101820", "-frames:v", "1", str(right)])
    run([
        "ffmpeg", "-hide_banner", "-loglevel", "error", "-y",
        "-i", str(left), "-i", str(right),
        "-filter_complex", "color=c=#101820:s=1920x1080:r=1[base];[base][0:v]overlay=0:0[tmp];[tmp][1:v]overlay=1264:0,format=rgb24[out]",
        "-map", "[out]", "-frames:v", "1", str(layout),
    ])

    expected = {
        poster: (1920, 1080), left: (656, 1080), right: (656, 1080), layout: (1920, 1080)
    }
    probes = {}
    verified = True
    for path, dims in expected.items():
        data = probe(path)
        probes[str(path.relative_to(PROJECT))] = data
        verified = verified and (data.get("width"), data.get("height")) == dims

    assets = {}
    for path in (poster_master, poster, left_master, left, right_master, right, layout):
        assets[str(path.relative_to(PROJECT))] = {"bytes": path.stat().st_size, "sha256": digest(path)}
    receipt = {
        "version": 3,
        "verified": verified,
        "source_canon_sha256": canon_hash,
        "normalization": "scale decrease + pad; no blind crop",
        "canvas": {"width": 1920, "height": 1080},
        "regions": {"left": {"x": 0, "width": 656}, "center": {"x": 656, "width": 608, "clean": True}, "right": {"x": 1264, "width": 656}},
        "visual_qa": "pending",
        "probes": probes,
        "assets": assets,
        "created_at": datetime.now(timezone.utc).isoformat(),
    }
    MANIFEST.write_text(json.dumps(receipt, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
    print(json.dumps({"verified_dimensions": verified, "source_canon_sha256": canon_hash, "layout": str(layout), "visual_qa": "pending"}, ensure_ascii=False))
    return 0 if verified else 1


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