"""
Diagnostic : liste toutes les polices utilisées dans un PDF et indique
lesquelles ne sont pas embarquées (ce qui invalide la conformité PDF/A-3).

Usage :
    python diagnostic_polices.py mon_fichier.pdf
"""

import sys
import pikepdf


def police_est_embarquee(font_dict) -> bool:
    descripteur = None

    if "/FontDescriptor" in font_dict:
        descripteur = font_dict["/FontDescriptor"]
    elif "/DescendantFonts" in font_dict:
        # Polices composites (Type0/CID), le descripteur est sur la police fille
        descendante = font_dict["/DescendantFonts"][0]
        if "/FontDescriptor" in descendante:
            descripteur = descendante["/FontDescriptor"]

    if descripteur is None:
        return False

    return any(
        cle in descripteur
        for cle in ("/FontFile", "/FontFile2", "/FontFile3")
    )


def diagnostiquer(chemin_pdf: str) -> None:
    pdf = pikepdf.open(chemin_pdf)
    probleme_trouve = False

    for numero_page, page in enumerate(pdf.pages, start=1):
        ressources = page.get("/Resources", {})
        polices = ressources.get("/Font", {})

        for nom_police, police in polices.items():
            base_font = str(police.get("/BaseFont", "?"))
            embarquee = police_est_embarquee(police)

            statut = "OK (embarquée)" if embarquee else "PROBLÈME (non embarquée)"
            print(f"Page {numero_page} — {nom_police} → {base_font} : {statut}")

            if not embarquee:
                probleme_trouve = True

    print()
    if probleme_trouve:
        print("Au moins une police non embarquée a été trouvée : le fichier "
              "échouera la validation PDF/A-3.")
        sys.exit(1)
    else:
        print("Toutes les polices utilisées sont correctement embarquées.")


if __name__ == "__main__":
    if len(sys.argv) < 2:
        print(f"Usage : python {sys.argv[0]} <fichier.pdf>")
        sys.exit(1)

    diagnostiquer(sys.argv[1])
