"""Şekli eksiklik ön-tarayıcı endpoint'i.

Vekil, başvuruyu yüklemeden önce tarifname/istem/özet metinlerini hedef
patent ofisinin (TR | EP | US) şekli inceleme kurallarına göre tarar.
Ofisin reddedeceği eksiklikler (alt başlıklı istemler, eksik abstract,
hatalı numaralandırma, 150 kelime aşımı vb.) önceden bildirilir.

İki katman birleştirilir:
- Deterministik kurallar — her zaman çalışır, LLM'siz, ücretsiz.
  Ofise göre kural seti seçilir (rules.py + epo.py + uspto.py).
- Yabancı terim kontrolü — Claude Haiku; yalnızca TR başvurularında.
"""

from __future__ import annotations

from fastapi import APIRouter
from pydantic import BaseModel, Field

from app.services.formality import run_deterministic_checks
from app.services.formality.models import FormalityReport, Jurisdiction
from app.services.formality.terms import check_foreign_terms

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


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

    description: str = Field(
        default="", description="Tarifname metni", max_length=200_000
    )
    claims: str = Field(default="", description="İstemler metni", max_length=100_000)
    abstract: str = Field(default="", description="Özet metni", max_length=10_000)
    invention_title: str = Field(
        default="",
        max_length=300,
        description="Buluş başlığı — özet/tarifname tutarlılık kontrolü için",
    )
    jurisdiction: Jurisdiction = Field(
        default=Jurisdiction.TR,
        description="Hedef patent ofisi: TR | EP | US — kural setini belirler",
    )
    check_terms: bool = Field(
        default=True,
        description="Yabancı terim LLM kontrolü çalıştırılsın mı (yalnızca TR)",
    )


@router.post("/check")
async def formality_check(req: FormalityCheckRequest) -> FormalityReport:
    """Başvuru metinlerini şekli eksikliklere karşı tarar."""
    report = FormalityReport()

    # 1. Deterministik kurallar — her zaman, ofise göre kural seti.
    report.findings.extend(
        run_deterministic_checks(
            description=req.description,
            claims=req.claims,
            abstract=req.abstract,
            invention_title=req.invention_title,
            jurisdiction=req.jurisdiction,
        )
    )

    # 2. Yabancı terim kontrolü — yalnızca TürkPatent başvurularında
    #    anlamlı (EP/US başvuruları zaten İngilizce/Almanca/Fransızca).
    if req.check_terms and req.jurisdiction == Jurisdiction.TR:
        term_findings, ran = await check_foreign_terms(
            description=req.description,
            claims=req.claims,
            abstract=req.abstract,
        )
        report.findings.extend(term_findings)
        report.checked_terms = ran

    # Bulguları ciddiyet sırasına göre sırala: error → warning → info.
    severity_order = {"error": 0, "warning": 1, "info": 2}
    report.findings.sort(key=lambda f: severity_order.get(f.severity.value, 9))

    report.recount()
    return report
