#!/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"
BRIEF = PROJECT / "script/story-brief.json"
PROMOTION = PROJECT / "story/promotion-report.json"
PLAN = PROJECT / "script/production-plan.json"
OUTPUT = PROJECT / "image/image-brief.json"


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


def main():
    required = (OUTLINE, IDENTITY, REVEAL, BRIEF, PROMOTION, PLAN)
    missing = [str(path) for path in required if not path.exists()]
    if missing:
        print("Image brief blocked: missing " + ", ".join(missing), file=sys.stderr)
        return 1
    outline = json.loads(OUTLINE.read_text(encoding="utf-8"))
    identity = json.loads(IDENTITY.read_text(encoding="utf-8"))
    story = json.loads(BRIEF.read_text(encoding="utf-8"))
    promotion = json.loads(PROMOTION.read_text(encoding="utf-8"))
    plan = json.loads(PLAN.read_text(encoding="utf-8"))
    canon = promotion.get("spoken_sha256")
    current_hashes = {
        "outline_sha256": file_sha(OUTLINE),
        "identity_registry_sha256": file_sha(IDENTITY),
        "reveal_ledger_sha256": file_sha(REVEAL),
        "story_brief_sha256": file_sha(BRIEF),
    }
    if promotion.get("verified") is not True or plan.get("canon_sha256") != canon or plan.get("status") != "story_promoted_ready_for_tts" or plan.get("authority_hashes") != current_hashes:
        print("Image brief blocked: story or authority not promoted", file=sys.stderr)
        return 1
    entities = {row["id"]: row for row in identity["entities"]}
    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"
    poster_text = ["Huyền An Audio", title, exclusive]
    image_brief = {
        "version": 1,
        "verified": True,
        "source_canon_sha256": canon,
        "canonical_title": title,
        "genre": story["genre"],
        "core_conflict": "Lạc Thanh Du chủ động kéo cần âm lượng xuống trong buổi phát trực tiếp sau khi phát hiện giọng nói bị dùng ngoài phạm vi đồng thuận; Tạ Minh Khiêm đứng phía sau, giữ bản ghi thô nhưng không được minh họa như người cứu cô.",
        "protagonist": entities["char_001"]["visual"] + ", một tay đặt trên cần âm lượng chính, chủ động, không yếu đuối thụ động",
        "supporting_cast": [
            entities["char_002"]["visual"] + ", đứng cách một khoảng tôn trọng, ánh mắt hối tiếc nhưng kiềm chế",
            "một phụ nữ Đông Á hư cấu khoảng 30 tuổi mặc vest xám bạc ở lớp nền, sắc thái khó đoán, không bị minh họa rõ là thủ phạm",
        ],
        "world": "Trung tâm phát thanh hư cấu tại Hàng Châu, phòng điều khiển kính, bàn trộn âm, đèn đỏ báo đang phát và hơi nước từ ấm nước; không logo hoặc địa danh thật đọc được.",
        "motifs": ["đèn đỏ báo đang phát", "cần âm lượng chính", "bản ghi thô", "hơi nước từ ấm nước", "hai nhịp gõ lên cốc"],
        "palette": "navy, charcoal, xanh thép và kem; điểm đỏ son cùng hổ phách ấm, không tím mặc định",
        "reveal_limit": plan["poster_reveal_limit"],
        "negative_constraints": [
            "không hiển thị phiên quản trị, kho giọng mồi hoặc bằng chứng quyết định đọc được",
            "không xác định Kiều Nhược Lam là thủ phạm hoặc mô tả lời thú nhận",
            "không biến Tạ Minh Khiêm thành người cứu hộ quyền lực và không mô tả cưỡng ép tình cảm",
            "không logo, thương hiệu, lễ hội, công ty, người hoặc tổ chức có thật; không watermark hoặc QR",
            "không bạo lực, không máu me, không anatomy lỗi",
            "không sai chính tả hoặc sai dấu trong các khối chữ chính",
        ],
        "assets": {
            "intro_poster": {"size": [1920, 1080], "composition": "Key art điện ảnh ngang, Lạc Thanh Du là focal point tại bàn trộn âm, một tay trên cần âm lượng; đèn đỏ và bản ghi thô là motif rõ; Tạ Minh Khiêm ở lớp sau qua kính phòng thu, provider tự cân typography, không che mặt hoặc crop chữ.", "required_text": poster_text},
            "right_panel": {"size": [1080, 1778], "target_size": [656, 1080], "composition": "Poster điện ảnh dọc hoàn chỉnh với Lạc Thanh Du là focal point tại bàn trộn âm; Tạ Minh Khiêm lùi sau qua kính phòng thu, đèn đỏ, hơi nước và dạng sóng trừu tượng làm motif; ba khối chữ tự dàn tự nhiên.", "required_text": poster_text},
            "left_panel": {"size": [1080, 1778], "target_size": [656, 1080], "composition": "Branding panel dọc tối giản cùng palette phòng thu, chỉ đèn đỏ, hơi nước hổ phách và đường dạng sóng trừu tượng; không người, không title truyện, không dòng độc quyền.", "required_text": ["Huyền An Audio", "Like • Chia sẻ • Đăng ký"]},
        },
        "authority_hashes": current_hashes,
        "created_at": datetime.now(timezone.utc).isoformat(),
    }
    OUTPUT.parent.mkdir(parents=True, exist_ok=True)
    OUTPUT.write_text(json.dumps(image_brief, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
    print(json.dumps({"verified": True, "canon": canon, "output": str(OUTPUT)}, ensure_ascii=False))
    return 0


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