"""
DOOBAT - Modèle d'intention
Structures de données pour l'analyse IA.
Copyright 2026 Vincent Gallet - Vincesoft
"""

from enum import Enum
from typing import Optional

from pydantic import BaseModel, Field, field_validator


class Intent(str, Enum):
    """Intentions possibles détectées par l'IA."""
    TARIF = "tarif"
    STOCK = "stock"
    CLIENT_DOCUMENTS = "client_documents"
    SUPPLIER_DOCUMENTS = "supplier_documents"
    ACTIONS = "actions"
    HELP = "help"
    UNKNOWN = "unknown"


class IntentAnalysis(BaseModel):
    """Résultat de l'analyse IA d'un message."""

    intent: Intent = Field(default=Intent.UNKNOWN, description="Intention détectée")
    client_name: str = Field(default="", max_length=100, description="Nom du client mentionné")
    supplier_name: str = Field(default="", max_length=100, description="Nom du fournisseur mentionné")
    article_name: str = Field(default="", max_length=100, description="Nom de l'article mentionné")
    confidence: float = Field(
        default=0.0,
        ge=0.0,
        le=1.0,
        description="Niveau de confiance entre 0.0 et 1.0",
    )

    @field_validator("client_name", "supplier_name", "article_name", mode="before")
    @classmethod
    def clean_string(cls, v) -> str:
        return str(v).strip()[:100] if v else ""

    @field_validator("confidence", mode="before")
    @classmethod
    def clamp_confidence(cls, v) -> float:
        try:
            return max(0.0, min(1.0, float(v)))
        except (TypeError, ValueError):
            return 0.0

    @property
    def is_confident(self) -> bool:
        """Retourne True si la confiance est suffisante (>= 0.6)."""
        return self.confidence >= 0.6

    @classmethod
    def from_dict(cls, data: dict) -> "IntentAnalysis":
        """Crée une IntentAnalysis depuis un dict brut."""
        return cls(
            intent=data.get("intent", Intent.UNKNOWN),
            client_name=data.get("client_name", ""),
            supplier_name=data.get("supplier_name", ""),
            article_name=data.get("article_name", ""),
            confidence=data.get("confidence", 0.0),
        )
