# ------------
# 导入所需模块和库
# ------------
import os                                                                        # 导入操作系统模块
import platform                                                                 # 导入平台识别模块
import subprocess                                                                # 导入子进程模块用于执行系统命令

import cv2                                                                       # 导入OpenCV视频处理库
import numpy as np                                                               # 导入NumPy数值计算库
from rich.console import Console                                                 # 导入富文本控制台输出库

# 重构后删除了_1_ytdlp模块，视频文件路径由主程序提供
# from core._1_ytdlp import find_video_files
from core.asr_backend.audio_preprocess import normalize_audio_volume           # 导入音频音量标准化功能
from core.utils import *                                                         # 导入核心工具函数
from core.utils.models import *                                                  # 导入模型相关工具

console = Console()                                                              # 初始化控制台对象

# ------------
# 文件路径常量定义
# ------------
DUB_VIDEO = "output/output_dub.mp4"                                             # 配音后的输出视频文件路径
DUB_SUB_FILE = 'output/final_trans.srt'                                       # 配音字幕文件路径
# 重构后：使用新的配音音频文件路径
DUB_AUDIO = _DUB_FINAL                                                          # 配音音频文件路径

# ------------
# 字幕样式常量定义
# ------------
TRANS_FONT_SIZE = 8                                                             # 翻译字幕的字体大小
TRANS_FONT_NAME = 'Arial'                                                       # 默认字体名称
if platform.system() == 'Linux':                                                # 如果是Linux系统
    TRANS_FONT_NAME = 'NotoSansCJK-Regular'                                     # 使用支持中文的字体
if platform.system() == 'Darwin':                                               # 如果是macOS系统
    TRANS_FONT_NAME = 'Arial Unicode MS'                                        # 使用Unicode字体

TRANS_FONT_COLOR = '&H00FFFF'                                                   # 字幕文字颜色（黄色）
TRANS_OUTLINE_COLOR = '&H000000'                                                # 字幕轮廓颜色（黑色）
TRANS_OUTLINE_WIDTH = 1                                                         # 字幕轮廓宽度
TRANS_BACK_COLOR = '&H33000000'                                                 # 字幕背景颜色（半透明黑色）

# ------------
# 视频音频合并主函数
# ------------
def merge_video_audio():
    """Merge video and audio, and reduce video volume"""
    # 重构后从output目录查找视频文件
    video_files = [f for f in os.listdir('output') if f.endswith(('.mp4', '.avi', '.mov', '.mkv'))]
    if not video_files:
        raise FileNotFoundError("在output目录下没有找到视频文件")
    VIDEO_FILE = os.path.join('output', video_files[0])                          # 使用第一个找到的视频文件
    background_file = _BACKGROUND_AUDIO_FILE                                    # 获取背景音频文件路径
    
    # ------------
    # 检查是否烧录字幕
    # ------------
    if not load_key("burn_subtitles"):                                          # 如果不烧录字幕到视频中
        rprint("[bold yellow]Warning: A 0-second black video will be generated as a placeholder as subtitles are not burned in.[/bold yellow]")  # 打印警告信息

        # ------------
        # 创建黑色占位视频
        # ------------
        frame = np.zeros((1080, 1920, 3), dtype=np.uint8)                       # 创建黑色帧（1080p分辨率）
        fourcc = cv2.VideoWriter_fourcc(*'mp4v')                                # 设置视频编码器
        out = cv2.VideoWriter(DUB_VIDEO, fourcc, 1, (1920, 1080))               # 创建视频写入器
        out.write(frame)                                                         # 写入黑色帧
        out.release()                                                            # 释放视频写入器

        rprint("[bold green]Placeholder video has been generated.[/bold green]")  # 打印完成信息
        return                                                                   # 提前返回，不进行后续处理

    # ------------
    # 音频标准化处理
    # ------------
    normalized_dub_audio = 'output/normalized_dub.wav'                          # 标准化后的配音文件路径
    normalize_audio_volume(DUB_AUDIO, normalized_dub_audio)                     # 对配音音频进行音量标准化处理
    
    # ------------
    # 获取视频分辨率信息
    # ------------
    video = cv2.VideoCapture(VIDEO_FILE)                                        # 打开视频文件
    TARGET_WIDTH = int(video.get(cv2.CAP_PROP_FRAME_WIDTH))                     # 获取视频宽度
    TARGET_HEIGHT = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))                   # 获取视频高度
    video.release()                                                              # 释放视频对象
    rprint(f"[bold green]Video resolution: {TARGET_WIDTH}x{TARGET_HEIGHT}[/bold green]")  # 打印视频分辨率信息
    
    # ------------
    # 构建字幕滤镜配置
    # ------------
    subtitle_filter = (                                                         # 构建字幕样式滤镜字符串
        f"subtitles={DUB_SUB_FILE}:force_style='FontSize={TRANS_FONT_SIZE},"    # 设置字幕文件和字体大小
        f"FontName={TRANS_FONT_NAME},PrimaryColour={TRANS_FONT_COLOR},"         # 设置字体名称和主颜色
        f"OutlineColour={TRANS_OUTLINE_COLOR},OutlineWidth={TRANS_OUTLINE_WIDTH},"  # 设置轮廓颜色和宽度
        f"BackColour={TRANS_BACK_COLOR},Alignment=2,MarginV=27,BorderStyle=4'"  # 设置背景色、对齐方式、边距和边框样式
    )
    
    # ------------
    # 构建完整的滤镜图
    # ------------
    filter_graph = (                                                             # 构建完整的滤镜图字符串
        f"[0:v]scale={TARGET_WIDTH}:{TARGET_HEIGHT}:force_original_aspect_ratio=decrease,"  # 缩放视频并保持原始宽高比
        f"pad={TARGET_WIDTH}:{TARGET_HEIGHT}:(ow-iw)/2:(oh-ih)/2,"              # 填充视频到目标尺寸，居中对齐
        f"{subtitle_filter}[v];"                                                 # 应用字幕滤镜并输出为[v]流
        f"[1:a][2:a]amix=inputs=2:duration=first:dropout_transition=3[a]"       # 混合背景音和配音，以第一个音频时长为准
    )
    
    # ------------
    # 构建FFmpeg命令
    # ------------
    cmd = [                                                                      # 构建FFmpeg命令列表
        'ffmpeg', '-y', '-i', VIDEO_FILE, '-i', background_file, '-i', normalized_dub_audio,  # 输入三个文件：原视频、背景音、配音
        '-filter_complex', filter_graph                                          # 使用完整的复杂滤镜图
    ]

    # ------------
    # 检查是否使用GPU加速
    # ------------
    if load_key("ffmpeg_gpu"):                                                   # 如果启用GPU加速
        rprint("[bold green]Using GPU acceleration...[/bold green]")            # 打印GPU加速信息
        cmd.extend(['-map', '[v]', '-map', '[a]', '-c:v', 'h264_nvenc'])        # 使用NVIDIA GPU编码器
    else:                                                                        # 如果不使用GPU加速
        cmd.extend(['-map', '[v]', '-map', '[a]'])                              # 使用CPU编码

    # ------------
    # 添加音频编码参数和输出文件
    # ------------
    cmd.extend(['-c:a', 'aac', '-b:a', '96k', DUB_VIDEO])                       # 设置音频编码为AAC，比特率96k，指定输出文件
    
    # ------------
    # 执行FFmpeg命令并检查结果
    # ------------
    try:
        result = subprocess.run(cmd, check=True, capture_output=True, text=True)  # 执行FFmpeg命令并捕获输出
        rprint(f"[bold green]Video and audio successfully merged into {DUB_VIDEO}[/bold green]")  # 打印合成完成信息
    except subprocess.CalledProcessError as e:
        rprint(f"[bold red]FFmpeg命令执行失败！[/bold red]")
        rprint(f"[red]错误代码: {e.returncode}[/red]")
        rprint(f"[red]错误输出: {e.stderr}[/red]")
        raise e
    except Exception as e:
        rprint(f"[bold red]视频合成过程中出现未知错误: {e}[/bold red]")
        raise e

# ------------
# 主程序入口
# ------------
if __name__ == '__main__':                                                      # 如果直接运行此脚本
    merge_video_audio()                                                          # 执行视频音频合并函数
