"""Şekli eksiklik tarayıcısının veri modelleri."""

from __future__ import annotations

from enum import StrEnum

from pydantic import BaseModel, Field


class Jurisdiction(StrEnum):
    """Desteklenen patent ofisleri.

    Her ofisin şekli inceleme kuralları farklıdır:
    - TR: TürkPatent — 6769 sayılı SMK ve Başvuru Kılavuzu
    - EP: Avrupa Patent Ofisi — Rule 49 EPC
    - US: USPTO — 37 CFR 1.52 / 1.72 / 1.75
    """

    TR = "TR"
    EP = "EP"
    US = "US"


class Severity(StrEnum):
    """Bulgunun ciddiyeti.

    - ERROR:   Kurum başvuruyu reddeder / şekli eksiklik bildirir. Mutlaka
               düzeltilmeli.
    - WARNING: Reddi kesin değil ama itiraz/eksiklik yazısı riski yüksek.
    - INFO:    İyileştirme önerisi; başvuruyu engellemez.
    """

    ERROR = "error"
    WARNING = "warning"
    INFO = "info"


class Finding(BaseModel):
    """Tek bir şekli eksiklik bulgusu."""

    rule_id: str = Field(..., description="Kural kimliği, örn. 'claims.no_subheadings'")
    severity: Severity
    section: str = Field(
        ..., description="İlgili başvuru unsuru: tarifname | istemler | ozet | genel"
    )
    title: str = Field(..., description="Kısa Türkçe başlık")
    detail: str = Field(..., description="Sorunun açıklaması")
    suggestion: str = Field(
        default="", description="Vekile düzeltme önerisi (uygulanabilir, somut)"
    )
    excerpt: str = Field(
        default="", description="Sorunlu metin parçası (varsa), bağlam için"
    )
    legal_basis: str = Field(
        default="", description="Dayanak: kanun/yönetmelik/kılavuz maddesi"
    )


class FormalityReport(BaseModel):
    """Bir başvuru için tüm bulguların toplandığı rapor."""

    findings: list[Finding] = Field(default_factory=list)
    error_count: int = 0
    warning_count: int = 0
    info_count: int = 0
    checked_terms: bool = Field(
        default=False,
        description="Yabancı terim LLM kontrolü çalıştırıldı mı (API key vs.)",
    )

    def recount(self) -> None:
        """error/warning/info sayaçlarını findings'e göre günceller."""
        self.error_count = sum(1 for f in self.findings if f.severity == Severity.ERROR)
        self.warning_count = sum(
            1 for f in self.findings if f.severity == Severity.WARNING
        )
        self.info_count = sum(1 for f in self.findings if f.severity == Severity.INFO)
