import json
import re
from pathlib import Path

BASE_DIR = Path(r"c:\Projects\KieuStory")

# Load datasets
with open(BASE_DIR / "episodes/ep01/prompts/muse_prompts.json", "r", encoding="utf-8") as f:
    muse_data = json.load(f)
mp = muse_data.get("motion_prompts", {})

with open(BASE_DIR / "02_AI_Prompts/gemini_banana_prompts.json", "r", encoding="utf-8") as f:
    banana_data = json.load(f)

scenes_info = [
    {
        "id": "ep01_scene01",
        "num": 1,
        "title": "CẢNH 01: NGOẠI / NỘI. KHUNG TRUYỆN 198X & BẦU TRỜI XUÂN GIA TĨNH - CHIỀU TÀ / RẠNG ĐÔNG",
        "slugline": "EXT./INT. RURAL VILLAGE 198X / MING DYNASTY OUTSKIRTS - DUSK / DAWN",
        "shots_count": 21,
        "duration": "3m30s (210s)",
        "characters": ["Cụ ông (70t)", "Đứa cháu nhỏ (6t)", "Người dẫn chuyện (V.O.)"],
        "location": "Hiên nhà ngói ba gian làng quê Bắc Bộ 1980s -> Cổng thành & Bầu trời xuân kinh thành Gia Tĩnh triều Minh",
        "props": ["Quạt mo cau", "Chõng tre", "Chén nước chè xanh sóng sánh ánh hoàng hôn", "Lư hương giấy dó", "Khói thuốc lào"],
        "arc": "Thiết lập khung thời gian kép (Double-timeframe Frame Narrative) & Khúc dạo đầu triết lý: Từ hoài niệm làng quê Bắc Bộ thập niên 1980 với những câu thơ Lục bát Kiều ru ngủ đứa cháu nhỏ, ống kính time-warp xuyên không về năm thứ nhất niên hiệu Gia Tĩnh triều Minh, mở ra bức tranh thiên nhiên tuyệt mỹ 'Cỏ non xanh tận chân trời / Cành lê trắng điểm một vài bông hoa'."
    },
    {
        "id": "ep01_scene02",
        "num": 2,
        "title": "CẢNH 02: NỘI. GIA TRANG HỌ VƯƠNG - PHÒNG KHÁCH - NGÀY (SÁNG)",
        "slugline": "INT. VUONG FAMILY MANSION - LIVING ROOM - DAY (MORNING)",
        "shots_count": 15,
        "duration": "2m30s (150s)",
        "characters": ["Vương Ông (55t)", "Vương Bà (50t)", "Vương Quan (14t)"],
        "location": "Phòng khách gia trang họ Vương, gian nhà gỗ lim nề nếp trung lưu, câu đối sơn son thếp vàng",
        "props": ["Lư đồng chạm chữ Thọ tỏa khói trầm", "Ấm trà tử sa gia bảo", "Bộ bàn ghế gỗ trắc", "Tráp gỗ đựng tiền đồng"],
        "arc": "Thiết lập nề nếp gia phong trung lưu và sự ấm êm viên mãn của gia đình Vương viên ngoại trước ngày đại biến. Vương Ông đĩnh đạc thưởng trà dặn dò con trai Vương Quan chuẩn bị cùng hai chị Thúy Kiều - Thúy Vân xuất hành tảo mộ tiết Thanh minh. Tuân thủ nghiêm ngặt Anti-Male-Tears Directive (R4) với phong thái mực thước, điềm đạm."
    },
    {
        "id": "ep01_scene03",
        "num": 3,
        "title": "CẢNH 03: NỘI. KHUÊ PHÒNG THÚY KIỀU & THÚY VÂN - NGÀY (SÁNG)",
        "slugline": "INT. KIEU & VAN MAIDEN CHAMBER - DAY (MORNING)",
        "shots_count": 15,
        "duration": "2m30s (150s)",
        "characters": ["Thúy Kiều (16t)", "Thúy Vân (15t)", "Vương Quan (O.S. gọi ngoài cửa)"],
        "location": "Khuê phòng hai chị em họ Vương, rèm lụa mỏng buông rủ, ánh nắng mai rọi qua song cửa",
        "props": ["Cây đàn tỳ bà hồ cầm nạm xà cừ", "Gương đồng cổ", "Trâm cài hoa lê", "Hộp phấn nụ", "Áo Giao Lĩnh xanh ngọc bích của Kiều & Áo lụa trắng ngà của Vân"],
        "arc": "Giới thiệu dung nhan và tài sắc đối lập của hai nàng thiếu nữ tuổi trăng tròn: Thúy Vân đoan trang phúc hậu, nụ cười rạng rỡ hồn nhiên; Thúy Kiều tuyệt sắc giai nhân 'Làn thu thủy nét xuân sơn / Hoa ghen thua thắm liễu hờn kém xanh' với ánh mắt phảng phất nỗi u sầu tiền kiếp khi chạm tay vào dây đàn tỳ bà. Tiếng gọi rộn rã của Vương Quan thúc giục lên đường du xuân."
    },
    {
        "id": "ep01_scene04",
        "num": 4,
        "title": "CẢNH 04: NGOẠI. ĐƯỜNG NGOẠI Ô KINH THÀNH - HỘI THANH MINH - NGÀY (TRƯA)",
        "slugline": "EXT. IMPERIAL OUTSKIRTS ROAD - QINGMING FESTIVAL - DAY (NOON)",
        "shots_count": 12,
        "duration": "2m00s (120s)",
        "characters": ["Thúy Kiều", "Thúy Vân", "Vương Quan", "Đoàn nam thanh nữ tú du xuân", "Ngựa xe dập dìu"],
        "location": "Con đường thiên lý ngoại ô kinh thành rợp bóng hoa lê, bến sông và gò đồi cỏ non trải dài",
        "props": ["Xe ngựa gỗ chạm trổ", "Dù lụa ngũ sắc", "Thoi vàng vó rắc tro tiền giấy bay", "Quạt giấy đề thơ"],
        "arc": "Bức tranh lễ hội Thanh minh rực rỡ sắc màu văn hóa cổ phong: 'Gần xa nô nức yến anh / Chị em sắm sửa bộ hành chơi xuân / Dập dìu tài tử giai nhân / Ngựa xe như nước áo quần như nêm'. Khung cảnh tấp nập, thanh bình của ngày tảo mộ, tro tiền giấy vàng mã bay lượn trong gió xuân, dẫn dắt tự nhiên vào nhịp L-Cut âm thanh chuyển sang tiếng suối róc rách của Cảnh 05."
    },
    {
        "id": "ep01_scene05",
        "num": 5,
        "title": "CẢNH 05: NGOẠI. BỜ SUỐI & MỘ ĐẠM TIÊN - CHIỀU TÀ / HOÀNG HÔN (3 NHỊP NGUYỄN DU)",
        "slugline": "EXT. BROOKSIDE & DAM TIEN GRAVE - DUSK / SUNSET",
        "shots_count": 27,
        "duration": "4m30s (270s)",
        "characters": ["Thúy Kiều (16t)", "Thúy Vân (15t)", "Vương Quan (14t)", "Linh hồn Đạm Tiên (Hư ảnh sương khói)"],
        "location": "Bờ suối cạn u tịch, nhịp cầu gỗ rêu phong, nấm mồ vô chủ cỏ dầu dầu ven dòng nước",
        "props": ["Nấm mồ sè sè Đạm Tiên", "Bó hương trầm", "Trâm bạc khắc thơ", "Lá vàng xoáy lốc", "Dấu hài in rêu xanh"],
        "arc": "Bước ngoặt tâm lý và cảm thức định mệnh đầu tiên của Thúy Kiều qua 3 nhịp kịch bản kinh điển: (1) Cảnh chiều tà bờ suối ngọn tiểu khê nao nao; (2) Phát hiện nấm mồ hoang lạnh của kỹ nữ Đạm Tiên và nghe Vương Quan kể khúc tích tài hoa bạc mệnh; (3) Kiều rơi lệ thắp hương khấn vái, rút trâm bạc khắc thơ lên bia đá, gió lốc cuốn lá vàng và hiện tượng siêu nhiên huyền ảo: dấu hài in rêu rành rành. Khởi đầu mối liên hệ vô hình với Đạm Tiên."
    },
    {
        "id": "ep01_scene06",
        "num": 6,
        "title": "CẢNH 06: NGOẠI. BỜ SUỐI BÊN RẶNG LIỄU - TƯƠNG NGỘ KIM TRỌNG - HOÀNG HÔN",
        "slugline": "EXT. WILLOW BROOK - FIRST ENCOUNTER WITH KIM TRONG - GOLDEN SUNSET",
        "shots_count": 14,
        "duration": "2m20s (140s)",
        "characters": ["Thúy Kiều", "Thúy Vân", "Vương Quan", "Kim Trọng (18t)", "Tiểu đồng dắt ngựa"],
        "location": "Bờ suối bên rặng liễu tơ mềm phất phơ ánh hoàng hôn rực rỡ dát vàng",
        "props": ["Bạch mã yên bạc", "Áo gấm lam ngọc thêu song hạc của Kim Trọng", "Túi gấm đeo ngọc bội", "Cành liễu buông rủ"],
        "arc": "Cuộc gặp gỡ định mệnh mở màn thiên tình sử bất hủ: 'Chàng Vương quen mặt nhận rồi / Nhấp lê buông cương lại gần'. Tiếng chuông ngựa ngân vang (*nhạc vàng*), bóng chàng thư sinh trâm anh thế phiệt Kim Trọng xuất hiện tuấn tú phi phàm trên lưng ngựa trắng. Khoảnh khắc ánh mắt chạm nhau giữa Kim Trọng và Thúy Kiều mang tính điện ảnh sâu sắc, sét ái tình bùng nổ trong sự e ấp dịu dàng của buổi hoàng hôn buông lơi."
    },
    {
        "id": "ep01_scene07",
        "num": 7,
        "title": "CẢNH 07: NỘI. THƯ PHÒNG KIM TRỌNG (NHÀ TRỌ CẠNH VƯỜN THÚY) - ĐÊM",
        "slugline": "INT. KIM TRONG STUDY (LODGING NEXT TO THUY GARDEN) - NIGHT",
        "shots_count": 8,
        "duration": "1m20s (80s)",
        "characters": ["Kim Trọng (18t)", "Tiểu đồng (O.S. bưng nến)"],
        "location": "Thư phòng nhà trọ lợp ngói bên cạnh tường hoa vườn Thúy, cửa sổ nhìn sang rặng đào",
        "props": ["Án thư gỗ gụ", "Nến sáp đỏ lập lòe", "Bút lông, nghiên mực đá", "Tập giấy dó viết thơ tương tư"],
        "arc": "Nỗi tương tư da diết khôn nguôi của người quân tử: Kim Trọng dọn đến thuê nhà trọ sát vách gia trang họ Vương để ngày đêm ngóng trông bóng hồng. Ánh trăng rọi qua rèm trúc, chàng nho sinh chong đèn đọc sách nhưng tâm trí trôi dạt về tà áo xanh ngọc bích bên bờ suối. 'Người đâu gặp gỡ làm chi / Trăm năm biết có duyên gì hay không'."
    },
    {
        "id": "ep01_scene08",
        "num": 8,
        "title": "CẢNH 08: NGOẠI. BỨC TƯỜNG HOA NGĂN CÁCH HAI VƯỜN - TRƯA HÈ",
        "slugline": "EXT. FLOWER WALL DIVIDING TWO GARDENS - SUMMER NOON",
        "shots_count": 8,
        "duration": "1m20s (80s)",
        "characters": ["Kim Trọng (18t)", "Thúy Kiều (O.S. tiếng gọi / bước chân)"],
        "location": "Chân tường hoa phủ rêu ngăn cách nhà trọ Kim Trọng và vườn Thúy họ Vương, nhành đào vắt ngang tường",
        "props": ["Bức tường hoa gạch nung", "Nhành đào hoa trĩu quả", "Chiếc thoa kim vắt ngang cành đào", "Khăn lụa gấm"],
        "arc": "Cái duyên trời định qua cành hoa đào: Kiều vô tình đánh rơi chiếc thoa kim trên cành đào vươn qua bức tường hoa. Kim Trọng bắt gặp chiếc thoa vàng lấp lánh dưới nắng trưa hè, cẩn thận trèo lên nhặt lấy và chờ đợi thời cơ tương kiến. Khóa khẩu hình nghiêm ngặt (R5) khi Kim Trọng lắng nghe tiếng bước chân tìm thoa bên kia tường."
    },
    {
        "id": "ep01_scene09",
        "num": 9,
        "title": "CẢNH 09: NGOẠI. BỜ TƯỜNG HOA - KIM KIỀU TƯƠNG KIẾN & TRAO THOA - TRƯA HÈ",
        "slugline": "EXT. FLOWER WALL EDGE - RENDEZVOUS & HAIRPIN EXCHANGE - SUMMER NOON",
        "shots_count": 6,
        "duration": "1m00s (60s)",
        "characters": ["Kim Trọng (18t)", "Thúy Kiều (16t)"],
        "location": "Bậc thang đá bờ tường hoa ngăn cách, bóng râm mát rượi dưới tán lá đào",
        "props": ["Chiếc thoa kim vàng ròng tinh xảo", "Bậc thang đá rêu phong", "Tà áo xanh ngọc bích & Áo gấm lam ngọc"],
        "arc": "Kim - Kiều hội ngộ bên bờ tường hoa: Kim Trọng xuất hiện trao trả chiếc thoa kim đánh rơi. Cuộc đối thoại tao nhã, tình tứ đầy mực thước lễ giáo giữa hai tâm hồn đồng điệu. Khoảnh khắc đầu ngón tay khẽ chạm nhau khi trao thoa làm rung động cả không gian trưa hè, mở lối cho cuộc thề nguyền thâu đêm ở Cảnh 10."
    },
    {
        "id": "ep01_scene10",
        "num": 10,
        "title": "CẢNH 10: NGOẠI & NỘI. VƯỜN THÚY & THƯ PHÒNG KIM TRỌNG - ĐÊM RẰM THÁNG TƯ (CLIMAX HỒI 2)",
        "slugline": "EXT./INT. THUY GARDEN & KIM TRONG STUDY - FULL MOON NIGHT (ACT 2 CLIMAX)",
        "shots_count": 14,
        "duration": "2m20s (140s)",
        "characters": ["Kim Trọng (18t)", "Thúy Kiều (16t)"],
        "location": "Vườn Thúy ngập ánh trăng rằm tháng Tư và Thư phòng Kim Trọng ấm cúng ánh nến",
        "props": ["Vầng trăng vằng vặc đỉnh trời", "Đôi chén rượu đồng tâm", "Kéo bạc cắt tóc", "Lọn tóc mây thề nguyền", "Dải lụa đào viết lời thề bách niên", "Cây đàn tỳ bà hồ cầm"],
        "arc": "Đỉnh cao lãng mạn và cao trào trữ tình của Hồi 2: Nhân lúc gia đình vắng vẻ, Kiều xăm xăm băng lối vườn khuya sang thư phòng Kim Trọng dưới ánh trăng vằng vặc: 'Vầng trăng vằng vặc giữa trời / Đinh ninh hai miệng một lời song song'. Đôi uyên ương cùng uống chén rượu đồng tâm, cắt tóc bện nút đồng tâm, xé dải lụa đào viết lời thề nguyền son sắt, và Kiều gảy khúc đàn tỳ bà tương tư tuyệt đỉnh cho Kim Trọng say đắm lắng nghe. Đóng vai trò là cái neo cảm xúc hạnh phúc tột bậc đối lập hoàn toàn với đại biến chia ly sắp giáng xuống ở Scenes 11-15."
    }
]

def determine_shot_cut_type(sid, prev_sid, item, prev_item):
    if prev_sid is None:
        return "Cinematic Cut (Scene Opener)", "Kho Chân Dung / Master Environment Anchor"
    
    title = item.get("scene_title", "").lower()
    prev_title = prev_item.get("scene_title", "").lower() if prev_item else ""
    cam = item.get("camera_motion", "").lower()
    
    # Check subjects
    chars = [
        ("kim trọng", "04_Assets/characters/01_Main_Protagonists/kim_trong_18yo_720p.png"),
        ("thúy kiều", "04_Assets/characters/01_Main_Protagonists/thuy_kieu_maiden_16yo_720p.png"),
        ("thúy vân", "04_Assets/characters/01_Main_Protagonists/thuy_van_maiden_16yo_720p.png"),
        ("vương quan", "04_Assets/characters/02_Vuong_Family_And_Fate/vuong_quan_16yo_720p.png"),
        ("vương ông", "04_Assets/characters/02_Vuong_Family_And_Fate/vuong_ong_55yo_720p.png"),
        ("vương bà", "04_Assets/characters/02_Vuong_Family_And_Fate/vuong_ba_50yo_720p.png"),
        ("đạm tiên", "04_Assets/characters/02_Vuong_Family_And_Fate/dam_tien_720p.png"),
        ("cụ ông", "Banana Anchor cu_ong_198x"),
        ("đứa cháu", "Banana Anchor dua_chau_198x")
    ]
    
    curr_char = None
    curr_asset = None
    for name, asset in chars:
        if name in title:
            curr_char = name
            curr_asset = asset
            break
            
    prev_char = None
    for name, asset in chars:
        if name in prev_title:
            prev_char = name
            break
            
    if curr_char and prev_char and curr_char != prev_char:
        return f"Cinematic Cut (Chuyển vai: {prev_char.title()} -> {curr_char.title()})", curr_asset
    
    if "toàn cảnh" in title and ("cận cảnh" in prev_title or "đặc tả" in prev_title or "trung cận" in prev_title):
        return "Cinematic Cut (Nhảy cỡ cảnh / Góc nhìn mới)", "Banana Prompt Start Frame"
        
    if "chuyển cảnh" in title or "đổi góc" in title or "time-warp" in title or "xuyên không" in title:
        return "Cinematic Cut (Chuyển đổi góc máy / Time-warp)", "Banana Prompt Start Frame"
        
    return "Continuous Take (Cùng góc / Nối tiếp động tác)", f"Tail Frame (Frame 239) của {prev_sid}"

output_md = []
output_md.append("# BÁO CÁO KHẢO SÁT CHUYÊN SÂU TẬP 01 (EP01): KỊCH BẢN, PROMPTS, PHÂN LOẠI CÚ MÁY & QUY CHUẨN MASTERING ÂM THANH")
output_md.append("## CHIẾN DỊCH TÁI SẢN XUẤT 10 CẢNH TẬP 01 (EP01 RE-PRODUCTION CAMPAIGN) - 'THẬP NGŨ NIÊN'")
output_md.append("")
output_md.append("> **Ngày thực hiện**: 2026-10-09  ")
output_md.append("> **Đơn vị khảo sát**: Subagent Explorer (`explorer_survey_3`) thuộc Hội Đồng Đạo Diễn & Sản Xuất AI Cinema  ")
output_md.append("> **Căn cứ pháp lý & kỹ thuật**: Chỉ thị tối cao `AGENTS.md`, Kiến trúc hệ thống `GEMINI.md`, Yêu cầu tác nghiệp `ORIGINAL_REQUEST.md`, Sổ tay đạo diễn `00_Project_Bible/`  ")
output_md.append("> **Dự án**: **THẬP NGŨ NIÊN (THE FIFTEEN SPRINGS)** | Tác giả & Chủ sở hữu IP: **NGUYỄN SĨ SƠN**  ")
output_md.append("")
output_md.append("---")
output_md.append("")
output_md.append("## PHẦN 1: TỔNG QUAN CHIẾN DỊCH & BỐI CẢNH TÁI SẢN XUẤT (EXECUTIVE SUMMARY)")
output_md.append("")
output_md.append("### 1. Mục tiêu cốt tử của chiến dịch tái sản xuất Ep01")
output_md.append("Tập 01 (*Xuân Sắc Thề Nguyện & Giông Bão Đoạn Trường*) là tập phim mở màn định hình toàn bộ chuẩn mực điện ảnh, phong cách mỹ thuật và linh hồn của bộ phim 3 giờ (180 phút). Đợt sản xuất trước đây tuy đã hoàn thành một số shot thử nghiệm nhưng bộc lộ 3 vấn đề kỹ thuật nghiêm trọng cần khắc phục triệt để:")
output_md.append("1. **Nhiễm độc tạo hình (Thúy Kiều Image Infection)**: Hiện tượng gán nhầm ảnh Thúy Kiều cho các nhân vật khác (Vương Ông, Vương Bà, Vương Quan, Kim Trọng) hoặc nạp mù quáng Tail Frame của shot Kiều vào shot của Kim Trọng / Vương gia, dẫn đến việc AI sinh video bị biến dạng nhân vật (morphing), song sinh sai lệch hoặc nam nhân mang gương mặt nữ giới.")
output_md.append("2. **Thiếu cơ chế phân định Cú máy (Lack of Shot Classification)**: Hàm `resolve_start_frame()` trước đây kế thừa vô điều kiện `prev_tail` khi `shot_num > 1`. Quy chuẩn mới bắt buộc phân định rạch ròi giữa `Cinematic Cut` (chuyển cảnh/đổi nhân vật: BẮT BUỘC nạp Start Frame độc lập từ kho Character Bible hoặc Imagen 3 Banana prompt) và `Continuous Take` (cùng nhân vật/nối tiếp hành động: mới được phép nạp Tail Frame của shot trước).")
output_md.append("3. **Cổng kiểm duyệt 2 tầng Antigravity SDK**: Thiết lập Shot Gate (chấm điểm độc lập từng shot 10s >= 0.8 điểm) và Scene Gate (30-40s junction, kiểm tra trục 180 độ, color continuity, audio sync).")
output_md.append("4. **Dọn sạch và lưu trữ an toàn (Clean & Archive)**: Di chuyển 100% video cũ vào `04_Assets/archive/ep01_legacy_v1/`, dọn sạch keyframe lỗi tại `04_Assets/keyframes/ep01_*/`, bảo lưu nguyên vẹn 100% kho ảnh nhân vật gốc `04_Assets/characters/`.")
output_md.append("")
output_md.append("### 2. Phạm vi khảo sát & Cấu trúc 10 Cảnh trọng tâm (140 Shots)")
output_md.append("- Trong cấu trúc kịch bản 3 Hồi của Tập 01 (188 shots kịch bản gốc + 4 shots prologue = 192 shots):")
output_md.append("  - **10 Cảnh trọng tâm (`ep01_scene01` đến `ep01_scene10`)** bao gồm **140 shots** chính khóa. Đây là trục xương sống hoàn chỉnh của **Hồi 1 (Mùa Xuân Gia Phong - 63 shots)** và **Hồi 2 (Định Mệnh & Tình Đầu Hoa Mộng - 77 shots)**.")
output_md.append("  - Điểm dừng tại Cảnh 10 (*Vầng Trăng Thề Nguyện & Thư Phòng Kim Trọng - 14 shots*) chính là đỉnh cao hạnh phúc và cao trào trữ tình lãng mạn tột bậc của mối tình Kim - Kiều, tạo đòn bẩy kịch tính tương phản dữ dội trước khi bước vào khúc quanh bi kịch gia biến (Cảnh 11 đến 15 - 48 shots).")
output_md.append("- Báo cáo này khảo sát chi tiết 100% của 140 shots thuộc 10 cảnh này, đối chiếu trực tiếp giữa Kịch bản phân cảnh (`screenplay.md`), Kho prompt ảnh Imagen 3 Banana (`gemini_banana_prompts.json`), Kho motion prompt video Muse.ai (`muse_prompts.json`) và Hệ thống âm thanh 4-Stem.")
output_md.append("")
output_md.append("---")
output_md.append("")
output_md.append("## PHẦN 2: BẢNG KHẢO SÁT CHI TIẾT 10 PHÂN CẢNH TẬP 01 (EP01_SCENE01 ĐẾN EP01_SCENE10)")
output_md.append("")

total_shots_all = 0
cinematic_cuts_count = 0
continuous_takes_count = 0

for sc in scenes_info:
    sc_id = sc["id"]
    shots = [k for k in mp.keys() if k.startswith(sc_id)]
    total_shots_all += len(shots)
    
    output_md.append(f"### {sc['title']}")
    output_md.append(f"- **Mã cảnh**: `{sc_id}` | **Thứ tự**: Cảnh {sc['num']:02d} / 10 Cảnh")
    output_md.append(f"- **Slugline**: `{sc['slugline']}`")
    output_md.append(f"- **Thời lượng**: {sc['duration']} | **Tổng số shot**: **{len(shots)} shots**")
    output_md.append(f"- **Bối cảnh & Không gian**: {sc['location']}")
    output_md.append(f"- **Nhân vật xuất hiện**: {', '.join(sc['characters'])}")
    output_md.append(f"- **Đạo cụ biểu tượng (Key Props)**: {', '.join(sc['props'])}")
    output_md.append(f"- **Mạch kịch tính & Đường cong cảm xúc (Dramatic Arc)**: {sc['arc']}")
    output_md.append("")
    output_md.append("#### Bảng ánh xạ từng Shot (10s Shot-by-Shot Matrix):")
    output_md.append("")
    output_md.append("| Shot ID | Thời lượng | Cỡ Cảnh & Cú Máy | Phân Loại Cú Máy | Nhân Vật & Hành Động Chính | Start Frame Nạp Vào | Banana Prompt ID / Asset | Reverse Motion | Audio Guard |")
    output_md.append("| :--- | :---: | :--- | :--- | :--- | :--- | :--- | :---: | :---: |")
    
    prev_s = None
    for s in shots:
        m_item = mp[s]
        b_item = banana_data.get(s, {})
        
        title = m_item.get("scene_title", "")
        cam = m_item.get("camera_motion", "")
        rev = m_item.get("reverse_motion", False)
        ap = m_item.get("audio_prompt", "")
        has_guard = "✓ Đạt chuẩn" if "Tuyệt đối KHÔNG sinh nhạc nền" in ap else "✗ Thiếu"
        
        # Classification
        cut_type, sf_source = determine_shot_cut_type(s, prev_s, m_item, mp.get(prev_s))
        if "Cinematic Cut" in cut_type:
            cinematic_cuts_count += 1
            cut_badge = f"**{cut_type}**"
        else:
            continuous_takes_count += 1
            cut_badge = cut_type
            
        # Format action
        action_desc = m_item.get("motion_prompt", "")
        m_action = re.search(r"dien anh co phong tiep noi muot ma:\s*([^.]+)\.\.\s*([^.]+)\.", action_desc)
        if m_action:
            short_action = m_action.group(2)[:60] + "..."
        else:
            short_action = title[:50] + "..."
            
        # Banana key & asset
        b_anchor = b_item.get("character_anchor", "")
        asset_ref = m_item.get("character_asset_ref", "")
        asset_str = Path(asset_ref).name if asset_ref else (b_anchor if b_anchor else "Bối cảnh/Env")
        
        rev_str = "🔄 Bật" if rev else "—"
        
        output_md.append(f"| `{s}` | 10s | {cam[:35]} | {cut_badge} | {short_action} | {sf_source} | `{s}`<br>({asset_str}) | {rev_str} | {has_guard} |")
        prev_s = s
        
    output_md.append("")
    output_md.append("---")
    output_md.append("")

output_md.append("## PHẦN 3: KIỂM TOÁN CƠ SỞ DỮ LIỆU PROMPT & NGUYÊN NHÂN GỐC RỄ LỖI NHIỄM ĐỘC TẠO HÌNH")
output_md.append("")
output_md.append("### 1. Hiện trạng Kho Prompt Hệ Thống")
output_md.append(f"- **Kho ảnh Imagen 3 (`02_AI_Prompts/gemini_banana_prompts.json`)**: Chứa 1.146 mục, trong đó có đủ **188 prompts chi tiết cho toàn bộ 15 Cảnh của Tập 01** (từ `ep01_scene01_shot01` đến `ep01_scene15_shot06`). Riêng 10 cảnh trọng tâm có đúng **140 prompts** được cấu trúc tỉ mỉ với đầy đủ `character_anchor`, `environment_anchor`, và mô tả phong cách điện ảnh 8K 35mm film grain.")
output_md.append(f"- **Kho video Muse.ai (`episodes/ep01/prompts/muse_prompts.json` & master)**: Chứa **192 motion prompts** (188 shots cảnh + 4 shots prologue). 100% các prompt đều tích hợp trường `audio_prompt` với chỉ thị Audio Guard cấm nhạc rác.")
output_md.append("")
output_md.append("### 2. Nguyên nhân gốc rễ gây lỗi nhiễm độc Thúy Kiều (Root Cause Analysis)")
output_md.append("Qua khảo sát mã nguồn `05_Production_Pipeline/production_orchestrator.py` tại hàm `resolve_start_frame()`, chúng tôi đã bóc tách chính xác 3 lỗ hổng chí mạng:")
output_md.append("1. **Cơ chế thừa kế đuôi frame mù quáng (Blind Tail-Frame Inheritance)**:")
output_md.append("   ```python")
output_md.append("   # Trích đoạn production_orchestrator.py cũ:")
output_md.append("   if shot_num > 1:")
output_md.append("       prev_shot_id = f'{scene_prefix}_shot{shot_num - 1:02d}'")
output_md.append("       prev_tail = find_tail_frame(prev_shot_id)")
output_md.append("       if prev_tail:")
output_md.append("           return str(prev_tail.resolve())")
output_md.append("   ```")
output_md.append("   - Logic trên kiểm tra nếu `shot_num > 1` thì **ngay lập tức trả về tail frame của shot trước** mà hoàn toàn KHÔNG kiểm tra xem cú máy tiếp theo có đổi nhân vật hay đổi góc máy không!")
output_md.append("   - Hậu quả: Khi Shot N là Thúy Kiều (ví dụ cận cảnh Kiều), Shot N+1 chuyển sang Kim Trọng hoặc Vương Ông, Muse.ai bị ép nạp Tail Frame của Kiều làm Start Frame, dẫn đến hiện tượng morphing khuôn mặt nữ thành nam hoặc nam nhân có tóc dài và trâm cài.")
output_md.append("2. **Gán nhầm asset Thúy Kiều cho Kim Trọng trong JSON**:")
output_md.append("   - Tại `ep01_scene09_shot04`: Kim Trọng trao thoa kim nhưng `character_asset_ref` lại trỏ vào `thuy_kieu_maiden_16yo_720p.png`!")
output_md.append("   - Tại `ep01_scene10_shot03` đến `ep01_scene10_shot12`: Toàn bộ các shot trong đêm thề nguyền (kể cả các shot Kim Trọng mở cửa, nâng chén rượu, thề nguyền) đều bị gán cứng vào `thuy_kieu_maiden_16yo_720p.png` thay vì xen kẽ giữa Kim Trọng và Thúy Kiều.")
output_md.append("3. **Bỏ trống `character_asset_ref` ở các Scene mở đầu**:")
output_md.append("   - Tại Cảnh 01, 04, 05, 06, toàn bộ `character_asset_ref` bị để `null`, khiến hệ thống chỉ còn duy nhất 1 đường lùi là bấu víu vào `prev_tail`, biến chuỗi liên hoàn 27 shots của Mộ Đạm Tiên hoặc 14 shots của Tương ngộ Kim Trọng thành một chuỗi lây nhiễm hình ảnh dây chuyền nếu có bất kỳ frame nào bị lỗi.")
output_md.append("")
output_md.append("### 3. Giải pháp Khắc Phục Chuẩn Hóa (The Prescription)")
output_md.append("1. **Nâng cấp `resolve_start_frame()` với cờ phân loại Cú máy**:")
output_md.append("   - Nếu shot là `Cinematic Cut`: Tuyệt đối KHÔNG đọc `prev_tail`. Bắt buộc nạp ảnh chân dung từ `04_Assets/characters/` hoặc ảnh Imagen 3 mới sinh từ prompt `gemini_banana_prompts.json`.")
output_md.append("   - Nếu shot là `Continuous Take`: Chỉ cho phép nạp `prev_tail` khi và chỉ khi đối tượng chính trong shot N và N-1 cùng một nhân vật và cùng trục quay.")
output_md.append("2. **Sửa đổi toàn bộ 11 điểm sai lệch `character_asset_ref`** trong `episodes/ep01/prompts/muse_prompts.json` và master.")
output_md.append("")
output_md.append("---")
output_md.append("")
output_md.append("## PHẦN 4: HỆ QUY CHUẨN KỸ THUẬT HẬU KỲ & MASTERING ÂM THANH (AUDIO CONTINUITY & CONCAT)")
output_md.append("")
output_md.append("### 1. Kiến trúc Âm thanh 4 Lớp Độc lập (4-Stem Architecture)")
output_md.append("Mỗi scene trong 10 scene phải được phối trộn hoàn chỉnh từ 4 luồng âm thanh:")
output_md.append("1. **Stem 1 - BGM & Score (Nhạc nền cổ phong)**:")
output_md.append("   - Trải thảm liên tục theo Scene (từ 60s đến 270s). Tuyệt đối không cắt vụn theo shot 10s.")
output_md.append("   - Tần số: EQ Notch giảm -3dB đến -4.5dB ở dải 800Hz - 3.500Hz để nhường chỗ cho giọng thoại Kiều và Kim Trọng.")
output_md.append("2. **Stem 2 - Ambience & Soundscape (Âm cảnh môi trường 3D)**:")
output_md.append("   - Cảnh 01: Tiếng ve sầu râm ran hoàng hôn, tiếng gió rặng tre đầu ngõ.")
output_md.append("   - Cảnh 04: Âm cảnh đại lễ hội Thanh minh `ep01_scene04_festival_crowd_ambience_120s.wav` (đã có sẵn trong asset).")
output_md.append("   - Cảnh 05: Tiếng suối róc rách, tiếng lá vàng xào xạc, tiếng gió rít qua mộ hoang.")
output_md.append("   - Cảnh 10: Tiếng côn trùng đêm rằm thanh vắng, tiếng lá sen lay động trong gió khuya.")
output_md.append("3. **Stem 3 - Foley & Action SFX (Tác động cơ học)**:")
output_md.append("   - Micro-foley: Tiếng quạt mo cau `phành phạch`, tiếng áo lụa Giao Lĩnh sột soạt, tiếng trâm ngọc va chạm, tiếng lật trang sách giấy dó, tiếng kéo bạc cắt tóc thề.")
output_md.append("   - Macro-impact: Tiếng vó ngựa nện trên đường sỏi, tiếng chuông ngựa đồng (*nhạc vàng*) khi Kim Trọng xuất hiện.")
output_md.append("4. **Stem 4 - Dialogue & Voice-Over (Thoại & Lời ngâm thơ)**:")
output_md.append("   - De-Esser khử rít 5.5kHz - 7kHz, Warmth Boost 150Hz - 250Hz, Dynamic Sidechain Ducking tự động hạ BGM và Ambience **-14 dB** (Attack = 50ms, Release = 300ms) mỗi khi có thoại.")
output_md.append("")
output_md.append("### 2. Tiêu Chuẩn Ghép Nối Master (Sample-Accurate FFmpeg Concat)")
output_md.append("- **CẤM DÙNG OPENCV**: Tuyệt đối nghiêm cấm dùng OpenCV `cv2.VideoWriter` để ghép video (vì nuốt chửng 100% âm thanh AAC).")
output_md.append("- **Cú pháp FFmpeg chuẩn**: Ghép đồng bộ cả luồng hình và luồng tiếng qua `filter_complex concat`:")
output_md.append("  ```bash")
output_md.append("  ffmpeg -y -i shot01.mp4 -i shot02.mp4 ... -filter_complex \"[0:v:0][0:a:0][1:v:0][1:a:0]...concat=n=N:v=1:a=1[v][a]\" -map \"[v]\" -map \"[a]\" -c:v libx264 -crf 18 -preset slow -c:a aac -b:a 192k -ar 48000 scene_master_v1.mp4")
output_md.append("  ```")
output_md.append("- **Chuyển tiếp âm thanh**: Áp dụng Equal-Power Micro-Crossfade (`acrossfade=d=0.75:c1=qsin:c2=qsin`) để triệt tiêu hoàn toàn tiếng click/pop ngắt cụt giữa các shot.")
output_md.append("")
output_md.append("### 3. Tiêu Chuẩn Âm Lượng Phát Sóng Toàn Cầu (EBU R128 - YouTube Green Dollar)")
output_md.append("- **Integrated Loudness**: **`-14.0 LUFS` (±0.5 LUFS)**.")
output_md.append("- **True Peak**: **`-1.0 dBTP`** (chống clipping/méo tiếng trên mọi thiết bị).")
output_md.append("- **Loudness Range (LRA)**: **`9 - 11 LU`**.")
output_md.append("- **Audio Format**: AAC Stereo, 48.000 Hz, 192 kbps - 320 kbps.")
output_md.append("")
output_md.append("---")
output_md.append("")
output_md.append("## PHẦN 5: KẾ HOẠCH DỌN DẸP, LƯU TRỮ VÀ BẢO TỒN TÀI SẢN (ARCHIVE & WORKSPACE HYGIENE)")
output_md.append("")
output_md.append("### 1. Kế hoạch Di chuyển Video Cũ vào Kho Lưu trữ Bằng chứng IP")
output_md.append("- **Thư mục đích**: `04_Assets/archive/ep01_legacy_v1/`")
output_md.append("- **Danh mục di chuyển**: Toàn bộ các file video raw và master cũ của Ep01 trong `04_Assets/videos/` (`ep01_scene*.mp4`).")
output_md.append("- **Hồ sơ giải trình pháp lý**: Tạo tệp `04_Assets/archive/ep01_legacy_v1/README.md` thuyết minh rõ các bản render thử nghiệm này là bằng chứng xác thực quá trình sáng tạo và điều phối của con người (Human-in-the-Loop) phục vụ đăng ký Quyền tác giả tại Cục Bản quyền tác giả (Bộ VHTTDL).")
output_md.append("")
output_md.append("### 2. Kế hoạch Dọn sạch Keyframe Lỗi Nhiễm Độc")
output_md.append("- Quét và xóa bỏ toàn bộ các tệp `.jpg` và `.png` cũ trong `04_Assets/keyframes/ep01_scene*/` đã bị biến dạng hoặc nhiễm Thúy Kiều.")
output_md.append("- Chỉ giữ lại thư mục rỗng sẵn sàng đón nhận các Tail Frame chuẩn (Frame 239) được trích xuất từ các bản render mới đạt kiểm duyệt Antigravity.")
output_md.append("")
output_md.append("### 3. Bảo lưu Nguyên Vẹn Kho Chân Dung Master")
output_md.append("- Giữ nguyên vẹn 100% kho ảnh tại `04_Assets/characters/` (bao gồm `01_Main_Protagonists/`, `02_Vuong_Family_And_Fate/`, `04_Brokers_And_Brothels/`, `05_Imperial_Court_And_Officials/`).")
output_md.append("- Sử dụng trực tiếp các file ảnh 720p lossless (`thuy_kieu_maiden_16yo_720p.png`, `kim_trong_18yo_720p.png`, `vuong_ong_55yo_720p.png`, `vuong_quan_16yo_720p.png`, `thuy_van_maiden_16yo_720p.png`) làm Start Frame gốc cho mọi cú máy `Cinematic Cut`.")
output_md.append("")
output_md.append("---")
output_md.append("")
output_md.append("## PHẦN 6: CHỈ DẪN HÀNH ĐỘNG CHO CÁC SUBAGENTS KẾ TIẾP")
output_md.append("")
output_md.append("### 1. Dành cho Pipeline Engineer (antigravity_critic_gate.py & orchestrator)")
output_md.append("1. Sửa hàm `resolve_start_frame()` để đọc metadata `shot_type` (`cinematic_cut` vs `continuous_take`). Khi `cinematic_cut`, buộc nạp Character Asset hoặc sinh ảnh mới từ Banana prompt.")
output_md.append("2. Tích hợp module `antigravity_critic_gate.py` vào chu trình render, trả về Pydantic schema `VideoCriticVerdict(score: float, pass_gate: bool, issues: List[str])`.")
output_md.append("3. Kích hoạt ngưỡng kiểm duyệt: Score >= 0.8 mới ghi nhận video và trích Tail Frame 239. Nếu < 0.8, tự động re-take.")
output_md.append("")
output_md.append("### 2. Dành cho MLLM Critic Auditor")
output_md.append("1. **Shot-level Gate**: So sánh hình ảnh nhân vật xuất hiện trong 10s video với chân dung chuẩn trong `04_Assets/characters/`. Bắt lỗi nghiêm ngặt nếu Thúy Kiều xuất hiện trong cảnh chỉ có nam nhân, hoặc khuôn mặt nam nhân bị biến dạng.")
output_md.append("2. **Scene-level Gate (30-40s)**: Thẩm định điểm giao cắt (junction), kiểm tra quy tắc 180 độ (hướng nhìn của Kiều và Kim Trọng ở bờ tường hoa phải đối xứng nhau, không cùng nhìn về 1 hướng gây nhảy trục).")
output_md.append("")
output_md.append("### 3. Dành cho Scene Concat & Pacing Editor")
output_md.append("1. Sử dụng công cụ `05_Production_Pipeline/audio_continuity_engine.py` để ghép nối master từng cảnh bằng FFmpeg.")
output_md.append("2. Trải BGM cổ phong tương ứng cho từng scene, chạy Dynamic Ducking -14dB khi có thoại/ngâm thơ, và chuẩn hóa EBU R128 Two-pass về đúng -14 LUFS.")
output_md.append("")
output_md.append(f"> **Tổng kết số liệu khảo sát**: 10 Cảnh (`ep01_scene01` .. `ep01_scene10`) | **{total_shots_all} Shots** (100% 10s/shot) | **{cinematic_cuts_count} Cinematic Cuts** (cần Start Frame độc lập) | **{continuous_takes_count} Continuous Takes** (kế thừa Tail Frame) | **140 Banana Prompts** ánh xạ 1:1 | **100% Audio Guard Tuân thủ**.")

full_report_text = "\n".join(output_md)

with open(BASE_DIR / ".agents/teamwork/explorer_survey_3/survey_ep01_production.md", "w", encoding="utf-8") as f:
    f.write(full_report_text)

print("Report compiled successfully!")
print(f"Total lines: {len(output_md)}")
print(f"File size: {len(full_report_text)} bytes")
