"""
Limpieza de metadata PDF — ISO 27001 / ISO 27018.

Elimina el diccionario /Info completo y el stream XMP (/Metadata)
para que el PDF no exponga stack técnico, rutas de servidor ni
ningún campo de autoría generado por el motor de renderizado.
"""

import io
from pypdf import PdfReader, PdfWriter
from pypdf.generic import NameObject

_INFO_KEY = NameObject('/Info')
_XMP_KEY  = NameObject('/Metadata')


def aplicar_meta_limpia(writer: PdfWriter) -> None:
    """Elimina /Info y XMP de un PdfWriter antes de escribirlo a disco.

    Compatible con pypdf >= 4.x (IndirectObject API) y >= 6.x (sin .trailer).
    """
    # Limpiar /Info: resolver la referencia indirecta y borrar todas las claves
    try:
        info = writer._info_obj.get_object()
        for k in list(info.keys()):
            del info[k]
    except Exception:
        pass

    # Eliminar XMP (/Metadata) del catálogo raíz si existe
    try:
        if _XMP_KEY in writer._root_object:
            del writer._root_object[_XMP_KEY]
    except Exception:
        pass


def limpiar_metadata(pdf_path: str) -> None:
    """Elimina /Info y XMP de un PDF ya escrito en disco (reescribe in-place)."""
    buf = io.BytesIO()

    reader = PdfReader(pdf_path)
    writer = PdfWriter()
    for page in reader.pages:
        writer.add_page(page)

    aplicar_meta_limpia(writer)
    writer.write(buf)

    with open(pdf_path, 'wb') as f:
        f.write(buf.getvalue())
