"""İtiraz / şekli inceleme yazısı ayıklama endpoint'i.

Hedef patent ofisinin (TR | EP | US) gönderdiği şekli inceleme/itiraz
yazısı veya formal Office Action PDF'ini alıp, tespit edilen eksiklik
maddelerini yapılandırılmış biçimde döner. "İtiraz → düzeltme → değişiklik
evrakı" döngüsünün ilk halkasıdır: ayıklanan maddeler doğrudan değişiklik
evrakı formuna ön-doldurulabilir.
"""

from __future__ import annotations

import base64
import binascii

from fastapi import APIRouter, HTTPException
from pydantic import BaseModel, Field

from app.services.formality.models import Jurisdiction
from app.services.objection import (
    ObjectionExtractionError,
    ObjectionReport,
    extract_objection_text,
    parse_objection,
)

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


class ObjectionParseRequest(BaseModel):
    """Frontend → backend isteği."""

    pdf_base64: str = Field(
        ...,
        min_length=20,
        description="Base64 kodlanmış şekli inceleme/itiraz yazısı PDF'i",
    )
    jurisdiction: Jurisdiction = Field(
        default=Jurisdiction.TR,
        description=(
            "Yazının ait olduğu patent ofisi (TR | EP | US). Prompt ve "
            "kural eşleştirme tablosu buna göre seçilir."
        ),
    )


@router.post("/parse")
async def parse_objection_letter(req: ObjectionParseRequest) -> ObjectionReport:
    """Şekli inceleme/itiraz yazısı PDF'inden eksiklik maddelerini çıkarır."""
    try:
        pdf_bytes = base64.b64decode(req.pdf_base64, validate=True)
    except (binascii.Error, ValueError) as exc:
        raise HTTPException(
            status_code=400, detail=f"PDF base64 decode edilemedi: {exc}"
        ) from exc

    if not pdf_bytes.startswith(b"%PDF-"):
        raise HTTPException(
            status_code=400,
            detail="Yüklenen dosya geçerli bir PDF değil.",
        )

    try:
        text = extract_objection_text(pdf_bytes)
    except ObjectionExtractionError as exc:
        raise HTTPException(status_code=422, detail=str(exc)) from exc

    return await parse_objection(text, jurisdiction=req.jurisdiction)
