#!/bin/python3

from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
from reportlab.lib.units import inch

from PyPDF2 import PdfReader, PdfWriter
import sys
import os
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont


from logger_config import get_logger

# 获取日志记录器
logger = get_logger()

def create_watermark(watermark_text, output_pdf, font_path, font_size=24, num_copies=10, opacity=0.5):
    logger.debug("---create_watermark---")
    """
    创建包含多个水印副本的 PDF 文件。
    
    :param watermark_text: 水印文本
    :param output_pdf: 输出水印 PDF 文件路径
    :param font_path: 字体文件路径
    :param font_size: 字体大小
    :param num_copies: 水印副本数量
    :param opacity: 水印透明度
    """
    # 注册中文字体
    pdfmetrics.registerFont(TTFont('STSONG', font_path))

    # 创建 Canvas 对象
    c = canvas.Canvas(output_pdf, pagesize=letter)
    width, height = letter

    # 设置字体和透明度
    c.setFont("STSONG", font_size)
    c.setFillAlpha(opacity)

    # 计算水印文本的宽度和高度
    text_width = c.stringWidth(watermark_text, "STSONG", font_size)
    text_height = font_size * 1.2

    # 计算水印副本的间距和位置
    rows = int(num_copies ** 0.5)  # 行数
    cols = int(num_copies ** 0.5)  # 列数
    step_x = (width - 2 * inch) / cols  # 水平间距
    step_y = (height - 2 * inch) / rows  # 垂直间距

    # 添加水印副本
    for i in range(num_copies):
        row = i // cols  # 当前行
        col = i % cols   # 当前列
        x = inch + col * step_x  # 水平起始位置
        y = height - inch - row * step_y  # 垂直起始位置

        # 旋转坐标系并绘制文本
        c.saveState()
        c.translate(x, y)
        c.rotate(45)  # 旋转45度
        c.drawString(0, 0, watermark_text)
        c.restoreState()

    # 保存水印 PDF
    c.save()

def add_watermark(input_pdf, watermark_pdf, output_pdf):
    logger.debug("---add_watermark----")
    """
    将水印添加到目标 PDF 文件的每一页。
    
    :param input_pdf: 输入 PDF 文件路径
    :param watermark_pdf: 水印 PDF 文件路径
    :param output_pdf: 输出 PDF 文件路径
    """
    watermark_reader = PdfReader(watermark_pdf)
    watermark_page = watermark_reader.pages[0]

    reader = PdfReader(input_pdf)
    writer = PdfWriter()

    # 合并水印到每一页
    for page_number in range(len(reader.pages)):
        page = reader.pages[page_number]
        page.merge_page(watermark_page)  # 合并水印页面
        writer.add_page(page)

    # 写入最终的 PDF
    # with open(output_pdf, "wb") as output_file:
    #     logger.debug(f"调试：--output_pdf is::=====： {output_pdf}")
    #     writer.write(output_file)

    # 检查并创建 tmp 目录
    dir_path = os.path.dirname(output_pdf)
    tmp_dir = os.path.join(dir_path, "tmp")
    os.makedirs(tmp_dir, exist_ok=True)  # 创建 tmp 目录，如果已存在则忽略

    # 构建新的文件路径
    filename = os.path.basename(output_pdf)
    new_output_pdf = os.path.join(tmp_dir, filename)

    # 尝试写入文件
    try:
        with open(new_output_pdf, "wb") as output_file:
            writer.write(output_file)
        logger.debug(f"文件已成功写入: {new_output_pdf}")
    except PermissionError:
        logger.debug(f"错误：没有权限写入文件 {new_output_pdf}。")
    return new_output_pdf


def printer_watermark(filepath):
    logger.debug("---printer_watermark----")
    logger.debug(f"调试：--shuiyin=====： {filepath}")
    # print("23211111111==============")
    # 示例使用
    font_path = "/usr/share/fonts/kyfonts/STSONG.TTF"
    input_pdf = sys.argv[1] #filepath #"./input.pdf"
    watermark_pdf = "/opt/watermark-control/watermarks/watermark.pdf" # "/opt/watermark-control/watermarks/watermark.pdf
    
    output_pdf = sys.argv[1] #"/home/zy-arm/practice/demos/waterMark/out-cups.pdf" #"output-cups.pdf"

    # 创建中文水印 PDF（包含多个水印副本）
    #create_watermark("kylin所有，违者必究！！", watermark_pdf, font_path, font_size=36, num_copies=10, opacity=0.5)
    # 将水印添加到目标 PDF
    newpath = add_watermark(input_pdf, watermark_pdf, output_pdf)
    logger.debug(f"printer_watermark----end: {newpath}。")
    return newpath


# 判断是否是pdf文件
def is_pdf_file(file_path):
    try:
        with open(file_path, 'rb') as f:
            PdfReader(f)
        return True
    except Exception as e:
        return False





if __name__ == '__main__':
    if len(sys.argv) > 1 and  (filepath := sys.argv[1]) and is_pdf_file(filepath):
        print(printer_watermark(filepath))

