import os
import random

import moviepy.editor as mp
import math

font_path = '/Users/yaowentong/Desktop/video/mjt.ttf'
# bottom_font_path = '/Users/yaowentong/Desktop/ALIBABA-PUHUITI-MEDIUM.TTF'
os.environ["FFMPEG_BINARY"] = "/Users/yaowentong/Downloads/ffmpeg"


def gen_9_16_video(
        input_video,
        output_video,
        text_content,
        text_content_color,
        overlay_color,
        title_overlay_opacity,
        font_size,
        vertical_font_size,
        bottom_text_content,
        bottom_text_content_color,
        bottom_overlay_opacity,
        bottom_font_size,
        bottom_stroke_color,
        bottom_stroke_width,
        background_music=None,  # 背景音乐文件路径（可选）
        bgm_volume=0.5  # 背景音乐音量（0-1之间）
):
    video = mp.VideoFileClip(input_video)
    w, h = video.size  # 视频宽高（w=宽度，h=高度）
    video_duration = video.duration

    # -------------------------- 核心修改：音频处理逻辑 --------------------------
    original_audio = video.audio
    if original_audio is not None:
        # 原视频有音频：确保音频时长与视频一致（防止原音频时长不匹配）
        final_audio = original_audio.subclip(0, video_duration)
    else:
        # 原视频无音频：检查是否提供背景音乐
        if background_music:
            try:
                # 加载背景音乐并统一格式（避免编码问题）
                bgm = mp.AudioFileClip(background_music).set_duration(video_duration)
                video = video.set_audio(bgm)
            except Exception as e:
                print(f"加载背景音乐失败：{str(e)}")  # 捕获错误（如文件不存在、格式不支持）
                final_audio = None
        else:
            final_audio = None

    # -------------------------- 1. 顶部蒙层  -----------------------------------------------------
    yellow_overlay_h = math.ceil(h * 0.16)
    yellow_overlay_y = math.ceil(h * 0.11)
    yellow_overlay = mp.ColorClip(
        size=(w, yellow_overlay_h),
        color=overlay_color  # 黄色
    )
    yellow_overlay = yellow_overlay.set_opacity(title_overlay_opacity).set_duration(video.duration)
    yellow_overlay = yellow_overlay.set_position((0, yellow_overlay_y))

    # -------------------------- 2. 顶部文字 -----------------------------------------------------
    # 计算文字留白（左右、上下均为视频宽度的6%）
    padding = math.ceil(w * 0.04)  # 统一留白值

    # 文字区域的有效宽度和高度（黄色蒙层尺寸减去留白）
    text_area_width = w - 2 * padding  # 左右各减一个留白
    text_area_height = yellow_overlay_h - 2 * padding  # 上下各减一个留白
    vertical_stroke_color = 'black'
    vertical_stroke_width = 2
    text_clip = mp.TextClip(
        text_content,
        color=text_content_color,
        font=font_path,
        fontsize=font_size,
        align='Center',
        size=(text_area_width, text_area_height),
        stroke_color=vertical_stroke_color,
        stroke_width=vertical_stroke_width

    )

    # 设置文字位置：相对于黄色蒙层左上角偏移padding（即留白）
    # 整体位置 = 黄色蒙层位置 + 留白偏移
    text_x = padding  # 左边留白
    text_y = yellow_overlay_y + padding  # 上边留白（基于黄色蒙层的Y坐标）
    text_clip = text_clip.set_position((text_x, text_y)).set_duration(video.duration)

    # --------------------------3. 底部白色蒙层 --------------------------
    margin_x = math.ceil(w * 0.06)  # 单边边距（视频宽度的10%）
    bottom_overlay_w = w - 2 * margin_x  # 蒙层宽度 = 视频宽度 - 左右两边距
    bottom_overlay_x = margin_x  # 蒙层X坐标 = 左边距（即视频宽度的10%）

    # 保持原有的高度和Y坐标计算
    bottom_overlay_h = math.ceil(h * 0.64)
    bottom_overlay_y = math.ceil(h * 0.30)

    # 创建底部白色蒙层（后续代码不变）
    white_overlay = mp.ColorClip(
        size=(bottom_overlay_w, bottom_overlay_h),
        color=(255, 255, 255)
    )
    white_overlay = white_overlay.set_opacity(bottom_overlay_opacity).set_duration(video.duration)
    white_overlay = white_overlay.set_position((bottom_overlay_x, bottom_overlay_y))
    # -------------------------- 4. 仅供参考 --------------------------

    vertical_text = "视频内容仅供参考"
    vertical_stroke_color = 'black'
    vertical_stroke_width = 1
    vertical_text_processed = '\n'.join(vertical_text)

    # 创建竖排文字（通过旋转-90度实现竖排效果）
    vertical_text_clip = mp.TextClip(
        vertical_text_processed,
        color='white',  # 用红色突出显示提示文字
        font=font_path,
        align='center',
        fontsize=vertical_font_size,
        stroke_color=vertical_stroke_color,
        stroke_width=vertical_stroke_width
    )

    # 计算竖排文字位置（左下角，距离边缘保留留白）
    vertical_padding = math.ceil(w * 0.02)  # 竖排文字额外留白
    # X坐标：底部蒙层左边界 + 留白（旋转后文字宽度变为高度，需调整定位）
    vertical_x = bottom_overlay_x + vertical_padding
    # Y坐标：底部蒙层下边界 - 文字宽度（旋转后高度变宽度） - 留白
    vertical_y = math.ceil(h * 0.70)
    vertical_text_clip = vertical_text_clip.set_position(
        (vertical_x, vertical_y)
    ).set_duration(video.duration)

    # -------------------------- 5. 底部文字 --------------------------
    # 底部文字参数（可根据需求调整内容、字号、颜色）
    bottom_padding = math.ceil(w * 0.06)  # 底部文字留白（与顶部一致，均为w*0.06）

    # 底部文字有效区域（底部蒙层尺寸 - 上下左右留白）
    bottom_text_area_width = bottom_overlay_w - 2 * bottom_padding  # 左右各减留白
    bottom_text_area_height = bottom_overlay_h - 2 * bottom_padding  # 上下各减留白
    # 创建底部文字片段（自动换行、居中对齐，与顶部逻辑一致）
    bottom_text_clip = mp.TextClip(
        bottom_text_content,
        color=bottom_text_content_color,
        font=font_path,  # 复用字体路径
        fontsize=bottom_font_size,
        align='Center',  # 文字换行后仍居中
        size=(bottom_text_area_width, bottom_text_area_height),  # 限制在有效区域内
        stroke_color=bottom_stroke_color,  # 核心：文字描边颜色
        stroke_width=bottom_stroke_width  # 核心：文字描边宽度
    )

    # 底部文字位置（相对于底部蒙层左上角偏移留白，与顶部逻辑一致）
    bottom_text_x = bottom_overlay_x + bottom_padding  # 底部蒙层X坐标 + 左边留白
    bottom_text_y = bottom_overlay_y + bottom_padding  # 底部蒙层Y坐标 + 上边留白
    bottom_text_clip = bottom_text_clip.set_position((bottom_text_x, bottom_text_y)).set_duration(video.duration)

    # -------------------------- 5. 合成视频 --------------------------
    final_video = mp.CompositeVideoClip([
        # video, yellow_overlay, top_text_clip, white_overlay, bottom_text_clip
        video, yellow_overlay, text_clip, white_overlay, vertical_text_clip, bottom_text_clip
    ])

    # -------------------------- 6. 输出视频 --------------------------
    final_video.write_videofile(
        output_video,
        codec='libx264',
        audio_codec='aac',
        fps=video.fps
    )

    # 释放资源
    video.close()
    final_video.close()


def gen_16_9_video(
        input_video,
        output_video,
        text_content,
        text_content_color,
        overlay_color,
        title_overlay_opacity,
        font_size,
        vertical_font_size,
        bottom_text_content,
        bottom_text_content_color,
        bottom_overlay_opacity,
        bottom_font_size,
        bottom_stroke_color,
        bottom_stroke_width,
        background_music=None,  # 背景音乐文件路径（可选）
        bgm_volume=0.5  # 背景音乐音量（0-1之间）
):
    video = mp.VideoFileClip(input_video)
    w, h = video.size  # 视频宽高（w=宽度，h=高度）
    video_duration = video.duration

    # -------------------------- 核心修改：音频处理逻辑 --------------------------
    original_audio = video.audio
    if original_audio is not None:
        # 原视频有音频：确保音频时长与视频一致（防止原音频时长不匹配）
        final_audio = original_audio.subclip(0, video_duration)
    else:
        # 原视频无音频：检查是否提供背景音乐
        if background_music:
            try:
                # 加载背景音乐并统一格式（避免编码问题）
                bgm = mp.AudioFileClip(background_music).set_duration(video_duration)
                video = video.set_audio(bgm)
            except Exception as e:
                print(f"加载背景音乐失败：{str(e)}")  # 捕获错误（如文件不存在、格式不支持）
                final_audio = None
        else:
            final_audio = None

    # -------------------------- 1. 顶部蒙层  -----------------------------------------------------
    yellow_overlay_h = math.ceil(h * 0.16)
    yellow_overlay_y = math.ceil(h * 0.11)
    yellow_overlay = mp.ColorClip(
        size=(w, yellow_overlay_h),
        color=overlay_color  # 黄色
    )
    yellow_overlay = yellow_overlay.set_opacity(title_overlay_opacity).set_duration(video.duration)
    yellow_overlay = yellow_overlay.set_position((0, yellow_overlay_y))

    # -------------------------- 2. 顶部文字 -----------------------------------------------------
    # 计算文字留白（左右、上下均为视频宽度的6%）
    padding = math.ceil(h * 0.01)  # 统一留白值

    # 文字区域的有效宽度和高度（黄色蒙层尺寸减去留白）
    text_area_width = w - 2 * padding  # 左右各减一个留白
    text_area_height = yellow_overlay_h - padding  # 上下各减一个留白
    vertical_stroke_color = 'black'
    vertical_stroke_width = 2
    text_clip = mp.TextClip(
        text_content,
        color=text_content_color,
        font=font_path,
        fontsize=font_size,
        align='Center',
        size=(text_area_width, text_area_height),
        stroke_color=vertical_stroke_color,
        stroke_width=vertical_stroke_width

    )

    # 设置文字位置：相对于黄色蒙层左上角偏移padding（即留白）
    # 整体位置 = 黄色蒙层位置 + 留白偏移
    text_x = padding  # 左边留白
    text_y = yellow_overlay_y + padding  # 上边留白（基于黄色蒙层的Y坐标）
    text_clip = text_clip.set_position((text_x, text_y)).set_duration(video.duration)

    # --------------------------3. 底部白色蒙层 --------------------------
    margin_x = math.ceil(w * 0.06)  # 单边边距（视频宽度的10%）
    bottom_overlay_w = w - 2 * margin_x  # 蒙层宽度 = 视频宽度 - 左右两边距
    bottom_overlay_x = margin_x  # 蒙层X坐标 = 左边距（即视频宽度的10%）

    # 保持原有的高度和Y坐标计算
    bottom_overlay_h = math.ceil(h * 0.64)
    bottom_overlay_y = math.ceil(h * 0.30)

    # 创建底部白色蒙层（后续代码不变）
    white_overlay = mp.ColorClip(
        size=(bottom_overlay_w, bottom_overlay_h),
        color=(255, 255, 255)
    )
    white_overlay = white_overlay.set_opacity(bottom_overlay_opacity).set_duration(video.duration)
    white_overlay = white_overlay.set_position((bottom_overlay_x, bottom_overlay_y))
    # -------------------------- 4. 仅供参考 --------------------------

    vertical_text = "视频内容仅供参考"
    vertical_stroke_color = 'black'
    vertical_stroke_width = 1
    vertical_text_processed = '\n'.join(vertical_text)

    # 创建竖排文字（通过旋转-90度实现竖排效果）
    vertical_text_clip = mp.TextClip(
        vertical_text_processed,
        color='white',  # 用红色突出显示提示文字
        font=font_path,
        align='center',
        fontsize=vertical_font_size,
        stroke_color=vertical_stroke_color,
        stroke_width=vertical_stroke_width
    )

    # 计算竖排文字位置（左下角，距离边缘保留留白）
    vertical_padding = math.ceil(w * 0.02)  # 竖排文字额外留白
    # X坐标：底部蒙层左边界 + 留白（旋转后文字宽度变为高度，需调整定位）
    vertical_x = bottom_overlay_x + vertical_padding
    # Y坐标：底部蒙层下边界 - 文字宽度（旋转后高度变宽度） - 留白
    vertical_y = math.ceil(h * 0.60)
    vertical_text_clip = vertical_text_clip.set_position(
        (vertical_x, vertical_y)
    ).set_duration(video.duration)

    # -------------------------- 5. 底部文字 --------------------------
    # 底部文字参数（可根据需求调整内容、字号、颜色）
    bottom_padding = math.ceil(w * 0.06)  # 底部文字留白（与顶部一致，均为w*0.06）

    # 底部文字有效区域（底部蒙层尺寸 - 上下左右留白）
    bottom_text_area_width = bottom_overlay_w - 2 * bottom_padding  # 左右各减留白
    bottom_text_area_height = bottom_overlay_h - 2 * bottom_padding  # 上下各减留白
    # 创建底部文字片段（自动换行、居中对齐，与顶部逻辑一致）
    bottom_text_clip = mp.TextClip(
        bottom_text_content,
        color=bottom_text_content_color,
        font=font_path,  # 复用字体路径
        fontsize=bottom_font_size,
        align='Center',  # 文字换行后仍居中
        size=(bottom_text_area_width, bottom_text_area_height),  # 限制在有效区域内
        stroke_color=bottom_stroke_color,  # 核心：文字描边颜色
        stroke_width=bottom_stroke_width  # 核心：文字描边宽度
    )

    # 底部文字位置（相对于底部蒙层左上角偏移留白，与顶部逻辑一致）
    bottom_text_x = bottom_overlay_x + bottom_padding  # 底部蒙层X坐标 + 左边留白
    bottom_text_y = bottom_overlay_y + bottom_padding  # 底部蒙层Y坐标 + 上边留白
    bottom_text_clip = bottom_text_clip.set_position((bottom_text_x, bottom_text_y)).set_duration(video.duration)

    # -------------------------- 5. 合成视频 --------------------------
    final_video = mp.CompositeVideoClip([
        # video, yellow_overlay, top_text_clip, white_overlay, bottom_text_clip
        video, yellow_overlay, text_clip, white_overlay, vertical_text_clip, bottom_text_clip
    ])

    # -------------------------- 6. 输出视频 --------------------------
    final_video.write_videofile(
        output_video,
        codec='libx264',
        audio_codec='aac',
        fps=video.fps
    )

    # 释放资源
    video.close()
    final_video.close()


# -------------------------- 示例调用 --------------------------
if __name__ == "__main__":
    print('aaa')
#     list = [((53, 53, 53), '#ff890c', '#ff890c'),
#             ((27, 95, 171), '#fbf2e1', '#fbf2e1'),
#             ((253, 255, 239), '#53579f', '#53579f'),
#             ((30, 67, 50), '#fffbf0', '#fffbf0'),
#             ((198, 77, 52), '#e6f1d9', '#e6f1d9'),
#             ]
#
#     color_list = random.choice(list)
#     print(color_list)
#     # 1080 90 40 85
#     # 720 sora 60 25 55
#     gen_16_9_video(
#         input_video="/Users/yaowentong/Desktop/video/1111.mp4",
#         output_video="/Users/yaowentong/Desktop/video/1111_result.mp4",
#         # 文字内容
#         text_content='月子餐怎么做',
#         text_content_color=color_list[1],
#         overlay_color=color_list[0],
#         font_size=50,
#         vertical_font_size=20,
#         bottom_font_size=30,
#         bottom_text_content="""
# 猪肝 100 克菠菜 200 克猪肝 100 克菠菜 200 克猪肝 100 克
# 鸡蛋 2 个米酒 100 毫升猪肝 100 克菠菜 200 克 克猪肝 100 克
# 生姜 10 克盐 少许 克猪肝 100 克 克猪肝 100 克 克猪肝 100 克
# 油 适量水 适量 克猪肝 100 克 克猪肝 100 克 克猪肝 100 克
# 油 适量水 适量 克猪肝 100 克 克猪肝 100 克 克猪肝 100 克
# 油 适量水 适量 克猪肝 100 克 克猪肝 100 克 克猪肝 100 克 11
#         """,
#         bottom_text_content_color=color_list[1],
#         background_music='/Users/yaowentong/Desktop/Backbeat.mp3'
#     )
    # gen_16_9_video( input_video="/Users/yaowentong/Desktop/720_16_9.mp4")
