#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
生成竖式字幕图片
包含标题、副标题和中英文双字幕
"""

import os
import sqlite3
from PIL import Image, ImageDraw, ImageFont


def wrap_text(text, max_width, font):
    """
    自动换行文本，确保英文单词完整
    """
    words = text.split()
    lines = []
    current_line = []
    current_width = 0
    
    for word in words:
        word_width = font.getbbox(word)[2] - font.getbbox(word)[0]
        space_width = font.getbbox(' ')[2] - font.getbbox(' ')[0] if current_line else 0
        
        if current_width + space_width + word_width <= max_width:
            if current_line:
                current_line.append(' ')
                current_width += space_width
            current_line.append(word)
            current_width += word_width
        else:
            lines.append(''.join(current_line))
            current_line = [word]
            current_width = word_width
    
    if current_line:
        lines.append(''.join(current_line))
    
    return lines


def wrap_chinese_text(text, max_width, font):
    """
    自动换行中文文本，按字符分割
    """
    chars = list(text)
    lines = []
    current_line = []
    current_width = 0
    
    for char in chars:
        char_width = font.getbbox(char)[2] - font.getbbox(char)[0]
        
        if current_width + char_width <= max_width:
            current_line.append(char)
            current_width += char_width
        else:
            lines.append(''.join(current_line))
            current_line = [char]
            current_width = char_width
    
    if current_line:
        lines.append(''.join(current_line))
    
    return lines


def generate_vertical_subtitle_images(adid, adname, title, subtitle):
    """
    生成竖式字幕图片
    """
    # 连接数据库（使用正确的路径）
    conn = sqlite3.connect('../srtsegjoin/dpd.db')
    cur = conn.cursor()
    
    # 查询字幕数据
    cur.execute('SELECT idx, cn, en, start, end FROM srts WHERE adid=? ORDER BY idx', (adid,))
    srtsdata = cur.fetchall()
    conn.close()
    
    if not srtsdata:
        print(f"未找到adid={adid}的字幕数据")
        return
    
    # 创建输出目录
    output_dir = f"{adname}_vertical_images"
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
    
    print(f"开始生成竖式图片，共 {len(srtsdata)} 句...")
    
    # 加载字体
    try:
        # 尝试使用系统字体
        font_paths = [
            "C:/Windows/Fonts/msyh.ttc",      # 微软雅黑
            "C:/Windows/Fonts/simhei.ttf",    # 黑体
            "C:/Windows/Fonts/simsun.ttc",    # 宋体
        ]
        font_path = None
        for fp in font_paths:
            if os.path.exists(fp):
                font_path = fp
                break
        
        if font_path:
            title_font = ImageFont.truetype(font_path, 64)  # 标题64px
            subtitle_font = ImageFont.truetype(font_path, 52)  # 副标题52px
            chinese_font = ImageFont.truetype(font_path, 66)  # 中文66px
            english_font = ImageFont.truetype(font_path, 72)  # 英文72px
            print(f"使用字体: {font_path}")
        else:
            # 如果系统字体不可用，使用默认字体
            title_font = ImageFont.load_default()
            subtitle_font = ImageFont.load_default()
            chinese_font = ImageFont.load_default()
            english_font = ImageFont.load_default()
            print("未找到中文字体，使用默认字体")
    except Exception as e:
        # 如果系统字体不可用，使用默认字体
        title_font = ImageFont.load_default()
        subtitle_font = ImageFont.load_default()
        chinese_font = ImageFont.load_default()
        english_font = ImageFont.load_default()
        print(f"加载字体失败: {e}，使用默认字体")
    
    # 图片尺寸（竖式）
    width = 1080
    height = 1920
    
    for row in srtsdata:
        idx, cn, en, start, end = row
        
        # 去掉字幕最后的标点
        if cn and (cn.endswith('，') or cn.endswith('。')):
            cn = cn[:-1]
        if en and (en.endswith(',') or en.endswith('.')):
            en = en[:-1]
        
        # 创建黑色背景图片
        image = Image.new('RGB', (width, height), color='black')
        draw = ImageDraw.Draw(image)
        
        # 计算文本位置
        max_text_width = 1000  # 最大宽度1000px
        
        # 初始化变量
        title_lines = []
        subtitle_lines = []
        
        # 绘制标题
        if title:
            title_lines = wrap_text(title, max_text_width, title_font)
            title_y = 260  # 标题位置：下移四行（260px）
            
            for i, line in enumerate(title_lines):
                text_width = draw.textbbox((0, 0), line, font=title_font)[2]
                x = (width - text_width) // 2
                y = title_y + i * 80  # 行间距
                draw.text((x, y), line, font=title_font, fill='#FFFFFF')  # 白色
        
        # 绘制副标题
        if subtitle:
            subtitle_lines = wrap_text(subtitle, max_text_width, subtitle_font)
            subtitle_y = 260 + len(title_lines) * 80 + 40  # 副标题与标题间距：40px
            
            for i, line in enumerate(subtitle_lines):
                text_width = draw.textbbox((0, 0), line, font=subtitle_font)[2]
                x = (width - text_width) // 2
                y = subtitle_y + i * 60  # 行间距
                draw.text((x, y), line, font=subtitle_font, fill='#FFFFFF')  # 白色
        
        # 计算字幕区域位置
        subtitle_start_y = 260 + len(title_lines) * 80 + 40 + len(subtitle_lines) * 60 + 200  # 副标题与字幕间距：200px
        
        # 绘制中文
        if cn:
            cn_lines = wrap_chinese_text(cn, max_text_width, chinese_font)
            cn_start_y = subtitle_start_y
            
            for i, line in enumerate(cn_lines):
                text_width = draw.textbbox((0, 0), line, font=chinese_font)[2]
                x = (width - text_width) // 2
                y = cn_start_y + i * 80  # 行间距20px
                draw.text((x, y), line, font=chinese_font, fill='#FFD700')  # 黄色
        
        # 绘制英文
        if en:
            en_lines = wrap_text(en, max_text_width, english_font)
            en_start_y = subtitle_start_y + (len(cn_lines) * 80 if 'cn' in locals() else 0) + 20  # 中文下方20px
            
            for i, line in enumerate(en_lines):
                text_width = draw.textbbox((0, 0), line, font=english_font)[2]
                x = (width - text_width) // 2
                y = en_start_y + i * 90  # 行间距
                draw.text((x, y), line, font=english_font, fill='#FFFFFF')  # 白色
        
        # 保存图片
        output_file = os.path.join(output_dir, f"vertical_subtitle_{idx:03d}.png")
        image.save(output_file)
        print(f"  生成图片: {output_file}")
    
    print(f"\n完成！图片保存到: {output_dir}")


if __name__ == "__main__":
    # 使用adid=8397（698_罗永浩的十字路口）
    adid = 8397
    adname = "698_罗永浩的十字路口"
    title = "罗永浩的十字路口"
    subtitle = "译自@生哥奇葩说"  # 使用正确的author
    generate_vertical_subtitle_images(adid, adname, title, subtitle)