#!/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]
OUTLINE = PROJECT / "script/outline.json"
IDENTITY = PROJECT / "script/identity-registry.json"
REVEAL = PROJECT / "script/reveal-ledger.json"
PROMOTION = PROJECT / "story/promotion-report.json"
NARRATION = PROJECT / "story/spoken-narration.txt"
PLAN = PROJECT / "script/production-plan.json"
OUTPUT = PROJECT / "image/image-brief.json"


def main():
    required = (OUTLINE, IDENTITY, REVEAL, PROMOTION, NARRATION, PLAN)
    if any(not path.exists() for path in required):
        print("Image brief blocked: promoted story authority missing", file=sys.stderr)
        return 1
    outline = json.loads(OUTLINE.read_text(encoding="utf-8"))
    identity = json.loads(IDENTITY.read_text(encoding="utf-8"))
    reveal = json.loads(REVEAL.read_text(encoding="utf-8"))
    promotion = json.loads(PROMOTION.read_text(encoding="utf-8"))
    plan = json.loads(PLAN.read_text(encoding="utf-8"))
    canon = hashlib.sha256(NARRATION.read_bytes()).hexdigest()
    if promotion.get("verified") is not True or promotion.get("spoken_sha256") != canon or plan.get("canon_sha256") != canon:
        print("Image brief blocked: promoted canon hash mismatch", file=sys.stderr)
        return 1
    title = outline["canonical_title"]
    exclusive = "Truyện được phát độc quyền tại Huyền An Audio, nghiêm cấm sao chép dưới mọi hình thức"
    right_text = ["Huyền An Audio", title, exclusive]
    brief = {
        "version": 1,
        "verified": True,
        "source_canon_sha256": canon,
        "canonical_title": title,
        "genre": ["drama gia đình hư cấu", "quyền cư trú", "bí ẩn bảy chìa khóa", "phản công cộng đồng"],
        "core_conflict": "Tô Vãn Ninh bị ép bán nhà trọ Mộc Vũ trong mưa; bảy chiếc chìa khóa cũ tượng trưng cho bảy người từng được căn nhà che chở, nhưng poster không tiết lộ nội dung hồ sơ hoặc cơ chế phản công.",
        "protagonist": "Tô Vãn Ninh, phụ nữ châu Á hư cấu 31 tuổi, gương mặt thanh tú nhưng kiên nghị, tóc đen dài buộc thấp, áo khoác xanh than trên sơ mi kem, cầm chùm chìa khóa đồng cũ; ánh mắt bình tĩnh giữa áp lực.",
        "supporting_cast": [
            "Tô Cảnh Hào, nam khoảng 39 tuổi, vest than, vẻ lịch thiệp lạnh lùng, đứng dưới biển bán nhà nhưng không lộ hành vi giả mạo",
            "Lâm Tuệ San, nữ khoảng 58 tuổi, áo khoác nâu đỏ, giữ một chìa khóa đơn, vẻ vừa nghi ngờ vừa day dứt"
        ],
        "world": "Nhà trọ Mộc Vũ hư cấu trên phố Thanh Hòe tại thành phố Vân Khê, căn nhà gỗ-gạch cũ trong đêm mưa, hành lang đèn vàng, cửa sổ có hơi nước và sân nhỏ nhiều lớp chiều sâu.",
        "motifs": ["bảy chìa khóa đồng", "ổ khóa gỗ cũ", "mưa trên cửa kính", "biển bán nhà đỏ sẫm", "ánh đèn hành lang", "dây thường xuân"],
        "palette": "navy, charcoal, xanh rêu tối và nâu gỗ; điểm vàng hổ phách và đỏ sẫm có kiểm soát; không tím mặc định",
        "reveal_limit": reveal["poster_reveal_limit"],
        "assets": {
            "intro_poster": {"size": [1920,1080], "composition": "Key art điện ảnh ngang; vùng chữ sạch bên trái, Vãn Ninh trung tâm-phải trước nhà Mộc Vũ, Cảnh Hào và Tuệ San lùi sau; bảy chìa khóa chỉ là motif, không lộ ngăn hồ sơ.", "required_text": right_text, "output": "image/intro-poster-master.png"},
            "right_panel": {"master_ratio": "1080:1778", "target_size": [656,1080], "composition": "Poster dọc hoàn chỉnh; Vãn Ninh là focal point, nhà Mộc Vũ và hai nhân vật phụ xếp lớp; title và dòng độc quyền trong safe margin 7%.", "required_text": right_text, "output": "image/right-panel-master.png"},
            "left_panel": {"master_ratio": "1080:1778", "target_size": [656,1080], "composition": "Branding panel không nhân vật, không title truyện; dùng họa tiết mưa, gỗ, ổ khóa và ánh đèn hành lang tối giản.", "required_text": ["Huyền An Audio", "Like • Chia sẻ • Đăng ký"], "forbidden_text": [title, exclusive], "output": "image/left-panel-master.png"}
        },
        "identity_registry": identity,
        "negative_constraints": ["Không logo hoặc địa danh thật", "Không người nổi tiếng", "Không vẽ giấy từ bỏ giả, nội dung bảy ngăn, điều kiện chuyển quyền hoặc biên bản sai", "Không sai chữ chính", "Không dựng layout ba panel trong một ảnh"],
        "created_at": datetime.now(timezone.utc).isoformat()
    }
    OUTPUT.parent.mkdir(parents=True, exist_ok=True)
    OUTPUT.write_text(json.dumps(brief, ensure_ascii=False, indent=2)+"\n", encoding="utf-8")
    print(json.dumps({"verified":True,"source_canon_sha256":canon,"output":str(OUTPUT)},ensure_ascii=False))
    return 0

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