"""Şekli eksiklik giderme — "Değişiklik Gösteren Evrak" üretim endpoint'i.

TürkPatent şekli inceleme yazısına cevaben sunulması gereken "Tarifname
Takımında Yapılan Değişikliğin Gösterildiği Evrak"ı DOCX veya PDF olarak
üretir. Şekli eksiklik tarayıcısının (formality_check) doğal devamıdır:
tarayıcı eksikleri bulur → vekil düzeltir → bu endpoint değişikliği
belgeleyen resmî evrakı üretir.
"""

from __future__ import annotations

import re

from fastapi import APIRouter, HTTPException
from fastapi.responses import Response

from app.services.docx import (
    AmendmentInput,
    LibreOfficeNotFoundError,
    PdfConversionError,
    build_amendment_docx,
    convert_docx_to_pdf,
)

router = APIRouter(prefix="/amendment", tags=["amendment"])


def _slug(value: str) -> str:
    s = re.sub(r"[^a-zA-Z0-9_-]+", "_", value).strip("_")
    return s[:60] or "evrak"


@router.post("/generate")
async def generate_amendment(
    payload: AmendmentInput,
    fmt: str = "docx",
) -> Response:
    """Değişiklik gösteren evrakı üretir.

    Sorgu parametresi `fmt`: "docx" (varsayılan) veya "pdf".
    """
    if fmt not in ("docx", "pdf"):
        raise HTTPException(
            status_code=400, detail="fmt 'docx' veya 'pdf' olmalı."
        )

    docx_bytes = build_amendment_docx(payload)
    base = _slug(payload.application_number) + "_Degisiklik_Evraki"

    if fmt == "docx":
        return Response(
            content=docx_bytes,
            media_type=(
                "application/vnd.openxmlformats-officedocument."
                "wordprocessingml.document"
            ),
            headers={
                "Content-Disposition": f'attachment; filename="{base}.docx"',
            },
        )

    # fmt == "pdf"
    try:
        pdf_bytes = await convert_docx_to_pdf(docx_bytes)
    except LibreOfficeNotFoundError as exc:
        raise HTTPException(status_code=503, detail=str(exc)) from exc
    except PdfConversionError as exc:
        raise HTTPException(status_code=500, detail=str(exc)) from exc

    return Response(
        content=pdf_bytes,
        media_type="application/pdf",
        headers={
            "Content-Disposition": f'attachment; filename="{base}.pdf"',
        },
    )
