#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
PDF页码添加脚本
在PDF每页的最下方中间添加页码（默认纯数字：1, 2, 3...）
"""

import fitz  # PyMuPDF
import sys
import os
import io

# 设置标准输出编码为UTF-8（解决Windows GBK编码问题）
if sys.platform == 'win32':
    sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
    sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')

# Windows常见中文字体路径（按优先级排列）
CJK_FONT_CANDIDATES = [
    r"C:\Windows\Fonts\msyh.ttc",     # 微软雅黑
    r"C:\Windows\Fonts\msyhbd.ttc",   # 微软雅黑粗体
    r"C:\Windows\Fonts\simhei.ttf",   # 黑体
    r"C:\Windows\Fonts\simsun.ttc",   # 宋体
    r"C:\Windows\Fonts\SIMYOU.TTF",   # 幼圆
    r"C:\Windows\Fonts\msjh.ttc",     # 微软正黑体
    r"C:\Windows\Fonts\mingliu.ttc",  # 细明体
    r"C:\Windows\Fonts\Malgun.ttf",   # Malgun Gothic (韩文但含部分汉字)
]

# Linux/Mac 常见中文字体路径
CJK_FONT_CANDIDATES_LINUX = [
    "/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc",
    "/usr/share/fonts/truetype/wqy/wqy-microhei.ttc",
    "/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc",
    "/usr/share/fonts/truetype/noto/NotoSansCJK-Regular.ttc",
    "/usr/share/fonts/truetype/droid/DroidSansFallbackFull.ttf",
    "/usr/share/fonts/truetype/arphic/uming.ttc",
    "/System/Library/Fonts/PingFang.ttc",  # macOS
    "/System/Library/Fonts/STHeiti Light.ttc",  # macOS
]


def find_cjk_font():
    """查找系统中可用的中文字体"""
    candidates = CJK_FONT_CANDIDATES
    if sys.platform != 'win32':
        candidates = CJK_FONT_CANDIDATES_LINUX + CJK_FONT_CANDIDATES

    for font_path in candidates:
        if os.path.exists(font_path):
            return font_path
    return None


def add_page_numbers(input_pdf, output_pdf, format_type="number",
                     font_size=10, bottom_margin=30, color=(0, 0, 0)):
    """
    在PDF每页最下方中间添加页码

    参数:
        input_pdf: 输入PDF路径
        output_pdf: 输出PDF路径
        format_type: 页码格式
            - "chinese": 第 X 页 / 共 Y 页
            - "simple": X / Y
            - "number": X
        font_size: 字体大小（points）
        bottom_margin: 距离页面底部的距离（points）
        color: 文字颜色 (r, g, b)，范围0-1

    返回:
        成功返回True，失败返回False
    """
    try:
        doc = fitz.open(input_pdf)
        total_pages = len(doc)

        # 查找中文字体（仅chinese格式需要）
        cjk_font_path = None
        if format_type == "chinese":
            cjk_font_path = find_cjk_font()
            if cjk_font_path:
                print(f"Using CJK font: {cjk_font_path}")
            else:
                print("WARNING: No CJK font found, falling back to simple format")
                format_type = "simple"

        for page_num in range(total_pages):
            page = doc[page_num]
            rect = page.rect

            # 计算页码文本位置（页面底部居中）
            if format_type == "chinese":
                text = f"第 {page_num + 1} 页 / 共 {total_pages} 页"
                fontname = "china-s"
                # 使用CJK字体
                font = fitz.Font(fontfile=cjk_font_path)
            elif format_type == "simple":
                text = f"{page_num + 1} / {total_pages}"
                fontname = "helv"  # Helvetica 内置字体
                font = fitz.Font(fontname)
            else:  # number
                text = str(page_num + 1)
                fontname = "helv"
                font = fitz.Font(fontname)

            # 计算文本宽度以居中
            text_width = font.text_length(text, fontsize=font_size)
            text_height = font_size * 1.2  # 估算文本高度

            # 文本插入点（居中）
            x = (rect.width - text_width) / 2
            y = rect.height - bottom_margin

            # 在文本后绘制白色背景矩形，防止与页面内容重叠
            padding = 3
            bg_rect = fitz.Rect(
                x - padding,
                y - text_height - padding,
                x + text_width + padding,
                y + padding
            )
            page.draw_rect(bg_rect, color=(1, 1, 1), fill=(1, 1, 1))

            # 在页面上插入文本
            page.insert_text(
                fitz.Point(x, y),
                text,
                fontname=fontname if format_type != "chinese" else "china-s",
                fontfile=cjk_font_path if format_type == "chinese" else None,
                fontsize=font_size,
                color=color,
            )

        # 保存
        if os.path.exists(output_pdf):
            try:
                os.remove(output_pdf)
            except OSError as e:
                print(f"WARNING: Cannot remove existing file: {e}", file=sys.stderr)
                import tempfile
                temp_fd, temp_path = tempfile.mkstemp(suffix='.pdf', dir=os.path.dirname(output_pdf) or '.')
                os.close(temp_fd)
                output_pdf = temp_path

        doc.save(output_pdf, garbage=4, deflate=True)
        doc.close()

        print("SUCCESS: Page numbers added")
        print(f"Input: {input_pdf}")
        print(f"Output: {output_pdf}")
        print(f"Total pages: {total_pages}")
        print(f"Format: {format_type}")
        return True

    except Exception as e:
        print(f"ERROR: {str(e)}", file=sys.stderr)
        import traceback
        traceback.print_exc(file=sys.stderr)
        return False


if __name__ == "__main__":
    if len(sys.argv) < 3:
        print("Usage: python add_page_numbers.py <input_pdf> <output_pdf> [format] [font_size] [bottom_margin]")
        print()
        print("Parameters:")
        print("  input_pdf:     Input PDF file path")
        print("  output_pdf:    Output PDF file path")
        print("  format:        Page number format (default: number)")
        print("                   number   - 1, 2, 3...")
        print("                   simple   - 1 / 20")
        print("                   chinese  - 第 1 页 / 共 20 页")
        print("  font_size:     Font size in points (default: 10)")
        print("  bottom_margin: Distance from bottom in points (default: 40)")
        print()
        print("Examples:")
        print("  python add_page_numbers.py input.pdf output.pdf")
        print("  python add_page_numbers.py input.pdf output.pdf chinese")
        print("  python add_page_numbers.py input.pdf output.pdf simple 12 50")
        sys.exit(1)

    input_pdf = sys.argv[1]
    output_pdf = sys.argv[2]
    format_type = sys.argv[3] if len(sys.argv) > 3 else "number"
    font_size = float(sys.argv[4]) if len(sys.argv) > 4 else 10
    bottom_margin = float(sys.argv[5]) if len(sys.argv) > 5 else 30

    if not os.path.exists(input_pdf):
        print(f"ERROR: Input file not found: {input_pdf}", file=sys.stderr)
        sys.exit(1)

    if format_type not in ("chinese", "simple", "number"):
        print(f"ERROR: Invalid format type: {format_type}", file=sys.stderr)
        print("Valid formats: chinese, simple, number", file=sys.stderr)
        sys.exit(1)

    print("=" * 60)
    print("PDF Page Numbering Tool")
    print("=" * 60)
    print()

    success = add_page_numbers(input_pdf, output_pdf, format_type, font_size, bottom_margin)

    if success:
        print()
        print("SUCCESS: Page numbers added successfully!")
        sys.exit(0)
    else:
        print()
        print("ERROR: Failed to add page numbers!")
        sys.exit(1)
