#!/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"
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():
    for path in (OUTLINE, IDENTITY, REVEAL, PROMOTION, PLAN):
        if not path.exists():
            print("Image brief blocked: missing " + str(path), file=sys.stderr)
            return 1
    outline = json.loads(OUTLINE.read_text())
    reveal = json.loads(REVEAL.read_text())
    promotion = json.loads(PROMOTION.read_text())
    plan = json.loads(PLAN.read_text())
    canon = promotion.get("spoken_sha256")
    if promotion.get("verified") is not True or plan.get("canon_sha256") != canon or plan.get("status") != "story_promoted_ready_for_tts":
        print("Image brief blocked: story not promoted", 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"
    poster_text = ["Huyền An Audio", title, exclusive]
    brief = {
        "version": 1,
        "verified": True,
        "source_canon_sha256": canon,
        "canonical_title": title,
        "genre": ["drama nghề nghiệp hư cấu", "ẩm thực và an toàn thực phẩm", "vu oan", "phản công công khai"],
        "core_conflict": "Tống Nhã Tâm, một nữ đầu bếp tài năng, bị biến thành người chịu tội sau ca dị ứng tại đại tiệc. Hình ảnh chỉ thể hiện cú sốc công khai, căn bếp hỗn loạn và quyết tâm giữ phẩm giá; không xác định thủ phạm hay vật chứng quyết định.",
        "protagonist": "Tống Nhã Tâm, phụ nữ châu Á hư cấu khoảng 31 tuổi, gương mặt điềm tĩnh nhưng tổn thương, tóc đen búi thấp gọn gàng, áo bếp trưởng màu than có viền kem, đứng vững giữa áp lực đại tiệc.",
        "supporting_cast": [
            "Hứa Minh Uy, nam khoảng 40 tuổi mặc vest đen lịch lãm, nét mặt khó đoán, chỉ là nhân vật quyền lực mơ hồ chứ không bị minh họa như thủ phạm",
            "Lâm Gia Nghi, nữ khoảng 28 tuổi mặc áo bếp bánh màu kem, ánh mắt lo lắng nhưng kiên định"
        ],
        "world": "Trung tâm đại tiệc Vân Các hoàn toàn hư cấu về đêm; căn bếp mở bằng thép tối, đèn hổ phách, bàn tiệc sang trọng mờ phía sau, khách và nhân viên hỗn loạn nhưng không có thương tích giật gân.",
        "motifs": ["chín chiếc đĩa sứ trắng trừu tượng", "hơi nóng và ánh lửa bếp", "khăn bàn đỏ rượu", "dao bếp phản sáng như motif nghề nghiệp", "thẻ phục vụ không đọc được"],
        "palette": "charcoal, xanh đen, thép tối và kem; điểm hổ phách từ lửa bếp, đỏ rượu vang và vàng đồng có kiểm soát; không tím mặc định",
        "reveal_limit": reveal["poster_reveal_limit"],
        "negative_constraints": [
            "không sơ đồ đổi bàn hoặc chuỗi thẻ phục vụ có nội dung đọc được",
            "không nhật ký hàng đợi máy in nhãn hoặc lệnh in thứ mười",
            "không mẫu xốt lưu hoặc kết quả chất gây dị ứng",
            "không mô tả Hứa Minh Uy là người ra lệnh hay kẻ chiếm công thức",
            "không logo, tổ chức hoặc người có thật; không watermark, QR",
            "không máu me, không bệnh nhân hấp hối, 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 với Nhã Tâm là focal point, bếp đại tiệc và chín đĩa tạo nhịp thị giác; để provider tự cân đối nhân vật và typography tự nhiên, 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 Nhã Tâm, ánh lửa và đại tiệc nhiều lớp; ba khối chữ tự dàn theo nhịp key art, không khóa vị trí.",
                "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 bếp tiệc, không người, không title truyện, không dòng độc quyền; để provider tự dàn hai khối branding cân đối.",
                "required_text": ["Huyền An Audio", "Like • Chia sẻ • Đăng ký"]
            }
        },
        "authority_hashes": {
            "outline": file_sha(OUTLINE),
            "identity": file_sha(IDENTITY),
            "reveal": file_sha(REVEAL)
        },
        "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")
    print(json.dumps({"verified": True, "canon": canon, "output": str(OUTPUT)}, ensure_ascii=False))
    return 0


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