#!/usr/bin/env python3
# -*- coding: utf-8 -*-

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


def get_subtitles(adid, db_path):
    """
    从数据库获取字幕信息
    """
    conn = sqlite3.connect(db_path)
    cursor = conn.cursor()
    
    cursor.execute("""
        SELECT idx, cn, en FROM srts 
        WHERE adid = ? 
        ORDER BY idx
    """, (adid,))
    
    subtitles = []
    for row in cursor.fetchall():
        idx, cn, en = row
        subtitles.append((idx, cn, en))
    
    conn.close()
    return subtitles


def get_adname(adid, db_path):
    """
    从数据库获取adname
    """
    conn = sqlite3.connect(db_path)
    cursor = conn.cursor()
    
    cursor.execute("SELECT DISTINCT adname FROM srts WHERE adid = ? LIMIT 1", (adid,))
    result = cursor.fetchone()
    conn.close()
    
    if result:
        return result[0]
    return f"adid_{adid}"


def get_author(adname):
    """
    从author数据库获取作者信息
    """
    author_db_path = r"\\ll\d\wxvddata\dpd.db"
    try:
        conn = sqlite3.connect(author_db_path)
        cursor = conn.cursor()
        
        # 使用adname的前60个字符进行模糊匹配
        search_name = adname[:60]
        cursor.execute("SELECT author FROM ads WHERE name LIKE ? LIMIT 1", (f"%{search_name}%",))
        result = cursor.fetchone()
        conn.close()
        
        return result[0] if result else "未知"
        
    except Exception as e:
        print(f"获取作者信息失败: {e}")
        return "未知"


def wrap_text(text, font, max_width, is_chinese):
    """
    自动换行文本
    - 中文按字符换行
    - 英文按单词换行
    """
    lines = []
    current_line = []
    current_width = 0
    
    if is_chinese:
        # 中文按字符换行
        for char in text:
            char_width = font.getbbox(char)[2] - font.getbbox(char)[0]
            if current_width + char_width > max_width:
                lines.append(''.join(current_line))
                current_line = [char]
                current_width = char_width
            else:
                current_line.append(char)
                current_width += char_width
        if current_line:
            lines.append(''.join(current_line))
    else:
        # 英文按单词换行
        words = text.split()
        for word in words:
            word_width = font.getbbox(word + ' ')[2] - font.getbbox(word + ' ')[0]
            if current_width + word_width > max_width:
                lines.append(' '.join(current_line))
                current_line = [word]
                current_width = word_width
            else:
                current_line.append(word)
                current_width += word_width
        if current_line:
            lines.append(' '.join(current_line))  # 修复：英文最后一行使用空格连接
    
    return lines


def generate_subtitle_images(adid):
    """
    生成字幕图片
    """
    # 配置
    db_path = r'\\ll\D\xtrssvjj\db\dpd.db'
    
    # 获取adname
    adname = get_adname(adid, db_path)
    print(f"adname: {adname}")
    
    # 获取作者信息
    author = get_author(adname)
    print(f"author: {author}")
    
    # 输出目录
    output_dir = f"{adname}_images"
    
    # 清理输出目录
    if os.path.exists(output_dir):
        shutil.rmtree(output_dir)
    os.makedirs(output_dir)
    
    # 获取字幕
    subtitles = get_subtitles(adid, db_path)
    print(f"找到 {len(subtitles)} 句字幕")
    
    if not subtitles:
        print("错误：未找到字幕信息")
        return False
    
    # 图片配置
    width, height = 1920, 1080
    background_color = (0, 0, 0)
    text_color = (255, 255, 255)
    
    # 字体配置
    try:
        font_path = "C:\\Windows\\Fonts\\simsun.ttc"
        title_font = ImageFont.truetype(font_path, 72)
        subtitle_font = ImageFont.truetype(font_path, 52)
        content_font = ImageFont.truetype(font_path, 60)
    except Exception as e:
        print(f"字体加载失败: {e}")
        return False
    
    # 生成图片
    for i, (idx, cn, en) in enumerate(subtitles):
        # 创建图片
        img = Image.new('RGB', (width, height), background_color)
        draw = ImageDraw.Draw(img)
        
        # 处理文本：去掉句末标点
        cn = cn.rstrip('.?!,')
        en = en.rstrip('.?!,')
        
        # 计算标题位置
        title = adname.replace('_', ' ')
        title_bbox = draw.textbbox((0, 0), title, font=title_font)
        title_width = title_bbox[2] - title_bbox[0]
        title_x = (width - title_width) // 2
        title_y = 200
        
        # 计算副标题位置
        subtitle = f"译自@{author}"
        subtitle_bbox = draw.textbbox((0, 0), subtitle, font=subtitle_font)
        subtitle_width = subtitle_bbox[2] - subtitle_bbox[0]
        subtitle_x = (width - subtitle_width) // 2
        subtitle_y = title_y + 40
        
        # 计算中文内容位置
        cn_lines = wrap_text(cn, content_font, width - 400, is_chinese=True)
        cn_y = subtitle_y + 60
        for line in cn_lines:
            line_bbox = draw.textbbox((0, 0), line, font=content_font)
            line_width = line_bbox[2] - line_bbox[0]
            line_x = (width - line_width) // 2
            draw.text((line_x, cn_y), line, font=content_font, fill=text_color)
            cn_y += 80
        
        # 计算英文内容位置
        en_lines = wrap_text(en, content_font, width - 400, is_chinese=False)
        en_y = cn_y + 40
        for line in en_lines:
            line_bbox = draw.textbbox((0, 0), line, font=content_font)
            line_width = line_bbox[2] - line_bbox[0]
            line_x = (width - line_width) // 2
            draw.text((line_x, en_y), line, font=content_font, fill=text_color)
            en_y += 80
        
        # 保存图片
        output_path = os.path.join(output_dir, f"image_{idx:03d}.png")
        img.save(output_path)
        
        # 显示进度
        if (i + 1) % 10 == 0:
            print(f"生成字幕图片 {i+1}/{len(subtitles)}")
    
    print(f"完成！生成了 {len(subtitles)} 张字幕图片")
    print(f"输出目录: {output_dir}")
    return True


def main():
    """
    主函数
    """
    if len(sys.argv) != 2:
        print("用法: python generate_images.py <adid>")
        print("示例: python generate_images.py 8442")
        sys.exit(1)
    
    try:
        adid = int(sys.argv[1])
    except ValueError:
        print("错误：adid必须是数字")
        sys.exit(1)
    
    print(f"=== 字幕图片生成工具 ===")
    print(f"adid: {adid}")
    
    # 复述图片相关规则和避坑
    print("\n图片相关规则和避坑：")
    print("1. 图片尺寸：1920x1080")
    print("2. 背景色：黑色")
    print("3. 标题：使用完整标题，居中显示")
    print("4. 副标题：格式为'译自@作者名'，位于标题下方40像素")
    print("5. 字体：simsun.ttc（宋体）")
    print("6. 字号：标题72号，副标题52号，正文60号")
    print("7. 颜色：白色")
    print("8. 字幕处理：去掉句末标点，中文按字符换行，英文按单词换行")
    print("9. 实时显示进度：每处理10个文件显示一次进度")
    print("\n避坑记录：")
    print("- 错误3：Pillow的getsize()方法错误，已修复为使用getbbox()")
    print("- 错误8：英文文本最后一行单词间空格丢失，已修复为使用' '.join()")
    
    success = generate_subtitle_images(adid)
    
    if success:
        print("\n字幕图片生成完成！")
    else:
        print("\n字幕图片生成失败！")
        sys.exit(1)


if __name__ == "__main__":
    main()