"""
Conversion d'un .docx en .pdf, avec plusieurs stratégies selon l'environnement :

1. docx2pdf (Windows/macOS avec Microsoft Word installé) — rendu identique à Word,
   c'est la voie privilégiée sur un poste Instadrone équipé d'Office.
2. LibreOffice / soffice en mode headless (Windows, Linux, macOS) — repli si Word
   n'est pas disponible.

Lève PdfExportUnavailable avec un message clair si aucune méthode n'aboutit.
"""
import os
import shutil
import subprocess
import sys


class PdfExportUnavailable(Exception):
    pass


def _try_docx2pdf(docx_path, pdf_path):
    try:
        from docx2pdf import convert
    except Exception:
        return False
    try:
        convert(docx_path, pdf_path)
        return os.path.exists(pdf_path)
    except Exception:
        return False


def _find_soffice():
    for name in ("soffice", "libreoffice"):
        path = shutil.which(name)
        if path:
            return path
    # emplacements Windows usuels
    for p in (
        r"C:\Program Files\LibreOffice\program\soffice.exe",
        r"C:\Program Files (x86)\LibreOffice\program\soffice.exe",
    ):
        if os.path.exists(p):
            return p
    return None


def _try_soffice(docx_path, pdf_path):
    soffice = _find_soffice()
    if not soffice:
        return False
    outdir = os.path.dirname(os.path.abspath(pdf_path))
    try:
        subprocess.run(
            [soffice, "--headless", "--convert-to", "pdf", "--outdir", outdir, docx_path],
            check=True, timeout=180,
            stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL,
        )
    except Exception:
        return False
    produced = os.path.join(outdir, os.path.splitext(os.path.basename(docx_path))[0] + ".pdf")
    if produced != pdf_path and os.path.exists(produced):
        shutil.move(produced, pdf_path)
    return os.path.exists(pdf_path)


def docx_to_pdf(docx_path, pdf_path):
    """Convertit `docx_path` en `pdf_path`. Retourne pdf_path, ou lève
    PdfExportUnavailable si ni Word (docx2pdf) ni LibreOffice ne sont utilisables."""
    # docx2pdf pilote Word ; utile surtout sous Windows/macOS.
    if sys.platform.startswith("win") or sys.platform == "darwin":
        if _try_docx2pdf(docx_path, pdf_path):
            return pdf_path
    if _try_soffice(docx_path, pdf_path):
        return pdf_path
    # dernière tentative docx2pdf même hors Windows (au cas où)
    if _try_docx2pdf(docx_path, pdf_path):
        return pdf_path
    raise PdfExportUnavailable(
        "Impossible de convertir en PDF : ni Microsoft Word (via docx2pdf) ni "
        "LibreOffice n'ont pu être utilisés sur ce poste. Installez LibreOffice "
        "(gratuit) ou assurez-vous que Microsoft Word est disponible, puis "
        "réessayez. En attendant, le téléchargement Word (.docx) reste disponible."
    )
