#!/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]
PROMOTION = PROJECT / "story/promotion-report.json"
BRIEF = PROJECT / "script/story-brief.json"
IDENTITY = PROJECT / "script/identity-registry.json"
REVEAL = PROJECT / "script/reveal-ledger.json"
WORKFLOW_COPY = PROJECT / "script/workflow-copy-authority.json"
OUT = PROJECT / "image/image-brief.json"


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


def main():
    for path in (PROMOTION, BRIEF, IDENTITY, REVEAL, WORKFLOW_COPY):
        if not path.is_file():
            raise RuntimeError(f"missing {path}")
    promotion = json.loads(PROMOTION.read_text(encoding="utf-8"))
    brief = json.loads(BRIEF.read_text(encoding="utf-8"))
    workflow_copy = json.loads(WORKFLOW_COPY.read_text(encoding="utf-8"))
    if promotion.get("verified") is not True or promotion.get("project_id") != "014" or brief.get("verified") is not True:
        raise RuntimeError("promotion/brief authority mismatch")
    left_blocks = workflow_copy.get("left_panel", {}).get("ordered_text_blocks")
    if workflow_copy.get("approval_state") != "locked" or not isinstance(left_blocks, list) or len(left_blocks) != 2:
        raise RuntimeError("locked workflow-copy authority is invalid")
    title = brief["canonical_title"]
    receipt = {
        "version": 2, "verified": True, "project_id": "014", "source_canon_sha256": promotion["spoken_sha256"],
        "workflow_copy_authority_path": "script/workflow-copy-authority.json", "workflow_copy_authority_sha256": sha(WORKFLOW_COPY),
        "canonical_title": title, "primary_story_family": brief["primary_story_family"], "secondary_story_family": brief["secondary_story_family"],
        "world": "Nhà ga ngoại ô hư cấu Thanh Khê ở Thành Đô đương đại, mái vòm kính cũ, sân ga đã ngừng tàu thường nhật và khu chợ nghề thủ công đang được chuẩn bị; hoàn toàn hư cấu.",
        "protagonist": "Tạ Vân Chi, phụ nữ Trung Quốc hư cấu 28 tuổi, tóc đen ngang vai, áo khoác xanh lục đậm trên sơ mi kem, điềm tĩnh và tự chủ, cầm một tấm vé tàu trơn không chữ.",
        "love_interest": "Phó Cảnh Du, đàn ông Trung Quốc hư cấu 31 tuổi, áo khoác than chì, bình tĩnh nhưng hối lỗi, đứng lệch sang một bên và để lối đi hoàn toàn rộng mở.",
        "motifs": ["tấm vé tàu trơn không chữ", "hợp đồng đóng dấu đỏ nhưng không có chữ đọc được", "còi đồng của trưởng ga cũ", "bảng giờ tàu không có ký tự"],
        "palette": "xanh lục đậm, đồng cũ, kem ngà, than chì và ánh nắng hổ phách cuối chiều",
        "reveal_limit": "Chỉ gợi hợp đồng sắp hết hạn và quyền lựa chọn rời đi; không tiết lộ việc Cảnh Du từ bỏ quyền biểu quyết hoặc kết quả bỏ phiếu.",
        "negative_constraints": ["không tam giác tình cảm", "không phụ nữ thứ hai trong key art", "không tàu đang lao tới", "không cưỡng ép hoặc chặn đường", "không chữ ngoài các khối bắt buộc", "không logo thật", "không điều tra, bí ẩn hoặc tội phạm"],
        "assets": {
            "intro_poster": {"orientation": "16:9", "composition": "Đúng một phụ nữ và một đàn ông trưởng thành trên sân ga Thanh Khê yên tĩnh. Vân Chi ở tiền cảnh cạnh lối ra mở, cầm vé trơn; Cảnh Du đứng lệch phía sau, không chắn lối. Mái vòm kính và chiếc đồng hồ ga không số gợi thời hạn, không có tàu đang chạy.", "required_text": [title, "TRUYỆN AUDIO FULL", "HUYỀN AN AUDIO"]},
            "right_panel": {"orientation": "vertical", "composition": "Đúng Vân Chi ở tiền cảnh cầm vé tàu trơn, Cảnh Du ở hậu cảnh tôn trọng khoảng cách bên lối ra nhà ga. Không phụ nữ thứ hai, không đám đông, không tam giác.", "required_text": [title, "TRUYỆN AUDIO FULL", "HUYỀN AN AUDIO"]},
            "left_panel": {"orientation": "vertical", "composition": "Abstract premium audio channel branding only, soft sound-wave ribbons and warm light, no people, no station, no train, no ticket, no contract and no story scene.", "required_text": left_blocks},
        },
        "identity_registry_sha256": sha(IDENTITY), "reveal_ledger_sha256": sha(REVEAL), "created_at": datetime.now(timezone.utc).isoformat(),
    }
    OUT.parent.mkdir(parents=True, exist_ok=True)
    OUT.write_text(json.dumps(receipt, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
    print(json.dumps({"verified": True, "source_canon_sha256": receipt["source_canon_sha256"], "assets": list(receipt["assets"])}, ensure_ascii=False))
    return 0


if __name__ == "__main__":
    try:
        sys.exit(main())
    except Exception as exc:
        print("Image brief blocked: " + str(exc), file=sys.stderr)
        sys.exit(1)
