"""PDF 渲染：通过 AcroForm 表单字段填充（字段「值」里放占位符，如【营业执照号码】）。"""
from __future__ import annotations

from pathlib import Path

import pymupdf

from app.core.logger import get_logger
from app.core.response import AppError
from app.services.placeholder import has_placeholder, render_text

logger = get_logger(__name__)


def render_pdf(template_path: str | Path, values: dict, output_path: str | Path) -> dict:
    template_path = Path(template_path)
    output_path = Path(output_path)
    if not template_path.exists():
        raise AppError(f"模板文件不存在: {template_path}")

    doc = pymupdf.open(str(template_path))
    if not doc.is_form_pdf:
        doc.close()
        raise AppError("PDF 模板没有可填写的 AcroForm 表单字段，请提供带表单域的 PDF 模板")

    # 字段「值」里放了占位符（如【营业执照号码】），对每个字段的值做占位符替换
    replacements = 0
    unresolved: list[str] = []
    for page in doc:
        for widget in page.widgets():
            current = widget.field_value or ""
            if not has_placeholder(current):
                continue
            res = render_text(current, values)
            if res.rendered != current:
                # 用 field_value 赋值 + update()：同时更新 /V 与外观流 /AP，否则阅读器显示旧外观（空白）
                widget.field_value = res.rendered
                widget.update()
                replacements += res.replacements
            for key in res.unresolved:
                if key not in unresolved:
                    unresolved.append(key)

    output_path.parent.mkdir(parents=True, exist_ok=True)
    doc.save(str(output_path))
    doc.close()

    if unresolved:
        logger.warning("pdf 有 %d 个未填充占位符: %s", len(unresolved), unresolved)
    logger.debug("pdf 填充 %d 处 -> %s", replacements, output_path)

    return {
        "type": "pdf",
        "output": str(output_path),
        "replacements": replacements,
        "unresolved": unresolved,
    }
