#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Assembles Episode 06 Grand Feature Master, Short 06 (9:16), and Full 6-Episode Master Cut.
Preserves 100% video and audio fidelity via FFmpeg filter_complex concat.
"""

import os
import sys
import subprocess
from pathlib import Path

if sys.platform == "win32":
    try:
        sys.stdout.reconfigure(encoding="utf-8")
        sys.stderr.reconfigure(encoding="utf-8")
    except Exception:
        pass

BASE_DIR = Path(__file__).resolve().parent.parent
EXPORTS_DIR = BASE_DIR / "06_Exports"
SHORTS_DIR = EXPORTS_DIR / "shorts_1m_9x16"
SHORTS_DIR.mkdir(parents=True, exist_ok=True)

def assemble_ep06():
    print("=======================================================")
    print("🎬 GHÉP NỐI EPISODE 06 GRAND FEATURE MASTER (8 SCENES)")
    print("=======================================================")
    
    scenes = [f"ep06_scene{i:02d}_cinematic_master.mp4" for i in range(1, 9)]
    input_paths = [EXPORTS_DIR / s for s in scenes]
    
    for p in input_paths:
        if not p.exists():
            print(f"[!] Thiếu file: {p.name}")
            return False
            
    print(f"[✓] Đã sẵn sàng đủ 8 Scene Masters cho Episode 06!")
    
    # Xây dựng lệnh filter_complex concat
    inputs = []
    filter_inputs = []
    for i, p in enumerate(input_paths):
        inputs.extend(["-i", str(p)])
        filter_inputs.append(f"[{i}:v:0][{i}:a:0]")
        
    filter_complex = "".join(filter_inputs) + f"concat=n={len(input_paths)}:v=1:a=1[v][a]"
    raw_ep06_output = EXPORTS_DIR / "thap_ngu_nien_ep06_master_raw.mp4"
    
    cmd_concat = [
        "ffmpeg", "-y",
        *inputs,
        "-filter_complex", filter_complex,
        "-map", "[v]",
        "-map", "[a]",
        "-c:v", "libx264", "-crf", "18", "-preset", "slow",
        "-c:a", "aac", "-b:a", "192k", "-ar", "48000",
        str(raw_ep06_output)
    ]
    
    print("[1/3] Đang ghép nối 8 scenes bằng FFmpeg filter_complex...")
    subprocess.run(cmd_concat, check=True)
    
    # EBU R128 Master
    final_ep06_output = EXPORTS_DIR / "thap_ngu_nien_ep06_grand_feature_master_80s_1m20s.mp4"
    print("[2/3] Đang chuẩn hóa âm thanh điện ảnh chuẩn EBU R128 -14 LUFS...")
    cmd_norm = [
        "ffmpeg", "-y",
        "-i", str(raw_ep06_output),
        "-af", "loudnorm=I=-14:TP=-1.0:LRA=11",
        "-c:v", "copy",
        "-c:a", "aac", "-b:a", "192k", "-ar", "48000",
        str(final_ep06_output)
    ]
    subprocess.run(cmd_norm, check=True)
    if raw_ep06_output.exists():
        raw_ep06_output.unlink()
        
    print(f"[✓] HOÀN TẤT EPISODE 06 GRAND MASTER: {final_ep06_output.name}")
    print(f"    Dung lượng: {final_ep06_output.stat().st_size / 1024 / 1024:.2f} MB")
    
    # Tạo Short 06 (9:16 dọc)
    short_06 = SHORTS_DIR / "short_06_ep06_trung_phung_dai_ket_9x16.mp4"
    print(f"[3/3] Đang tạo YouTube Short 06 (9:16 dọc)...")
    cmd_short = [
        "ffmpeg", "-y",
        "-ss", "40", "-t", "20",
        "-i", str(final_ep06_output),
        "-filter_complex",
        "[0:v]split=2[bg][fg];"
        "[bg]scale=1080:1920:force_original_aspect_ratio=increase,crop=1080:1920,boxblur=20:5[bg_blur];"
        "[fg]scale=1080:608[fg_scaled];"
        "[bg_blur][fg_scaled]overlay=(W-w)/2:(H-h)/2[v]",
        "-map", "[v]",
        "-map", "0:a",
        "-c:v", "h264_nvenc", "-b:v", "6000k", "-preset", "p6",
        "-c:a", "aac", "-b:a", "192k",
        str(short_06)
    ]
    try:
        subprocess.run(cmd_short, check=True)
        print(f"[✓] Đã tạo Short 06: {short_06.name} ({short_06.stat().st_size / 1024 / 1024:.2f} MB)")
    except Exception as e:
        print(f"[!] Lỗi khi xuất short NVENC: {e}")
        
    return True

def assemble_roadshow_all_episodes():
    print("\n=======================================================")
    print("🎬 GHÉP NỐI BỘ PHIM ĐIỆN ẢNH HOÀN CHỈNH 6 TẬP (ROADSHOW FULL CUT)")
    print("=======================================================")
    
    ep_files = [
        EXPORTS_DIR / "thap_ngu_nien_ep01_grand_feature_master_450s_7m30s.mp4",
        EXPORTS_DIR / "thap_ngu_nien_ep02_grand_feature_master_190s_3m10s.mp4",
        EXPORTS_DIR / "thap_ngu_nien_ep03_grand_feature_master_140s_2m20s.mp4",
        EXPORTS_DIR / "thap_ngu_nien_ep04_grand_feature_master_120s_2min.mp4",
        EXPORTS_DIR / "thap_ngu_nien_ep05_grand_feature_master_80s_1m20s.mp4",
        EXPORTS_DIR / "thap_ngu_nien_ep06_grand_feature_master_80s_1m20s.mp4",
    ]
    
    for ep in ep_files:
        if not ep.exists():
            print(f"[!] Thiếu tập: {ep.name}")
            return False
            
    print(f"[✓] Đầy đủ 6 Tập Master hoàn chỉnh!")
    
    inputs = []
    filter_inputs = []
    for i, p in enumerate(ep_files):
        inputs.extend(["-i", str(p)])
        filter_inputs.append(f"[{i}:v:0][{i}:a:0]")
        
    filter_complex = "".join(filter_inputs) + f"concat=n={len(ep_files)}:v=1:a=1[v][a]"
    grand_output = EXPORTS_DIR / "thap_ngu_nien_ep01_to_ep06_grand_feature_master_1060s_17m40s.mp4"
    
    cmd_all = [
        "ffmpeg", "-y",
        *inputs,
        "-filter_complex", filter_complex,
        "-map", "[v]",
        "-map", "[a]",
        "-c:v", "libx264", "-crf", "18", "-preset", "slow",
        "-c:a", "aac", "-b:a", "192k", "-ar", "48000",
        str(grand_output)
    ]
    
    print("[1/1] Đang ghép nối toàn bộ 6 tập phim thành Grand Feature Master...")
    subprocess.run(cmd_all, check=True)
    print(f"[✓] HOÀN TẤT BỘ PHIM HOÀN CHỈNH 6 TẬP: {grand_output.name}")
    print(f"    Dung lượng: {grand_output.stat().st_size / 1024 / 1024:.2f} MB")
    return True

if __name__ == "__main__":
    if assemble_ep06():
        assemble_roadshow_all_episodes()
