"""Configuration — validée au démarrage, comme l'API NestJS (même philosophie)."""

from pydantic_settings import BaseSettings


class Reglages(BaseSettings):
    # Postgres partagé (schéma possédé par Prisma — apps/api)
    database_url: str = "postgresql://siop:siop@localhost:5432/siop"
    # MinIO en direct sur le réseau privé (ADR-004 §4 — jamais exposé)
    minio_endpoint: str = "localhost"
    minio_port: int = 9000
    minio_use_ssl: bool = False
    minio_access_key: str = "siop"
    minio_secret_key: str = "siop-minio"
    minio_bucket: str = "siop2"
    # Le service n'est JAMAIS public : seul l'API NestJS le contacte,
    # porteuse de ce secret partagé (ADR-004 §4).
    ai_service_token: str = "dev-only-ai-token"
    # Embeddings : « locale » (fastembed ONNX) ou « deterministe » (tests/CI)
    ai_embeddings: str = "locale"
    # Génération (ADR-004 §3) : « off » = mode extractif (défaut honnête,
    # la recette passe sans clé) ; « api » = rédaction par le LLM externe,
    # sur textes DÉJÀ anonymisés (D4), citations obligatoires.
    ai_generation: str = "off"
    ai_api_key: str = ""  # requise seulement si ai_generation=api — jamais loguée
    ai_model: str = "claude-opus-4-8"
    # Seuils de similarité — constantes de départ, calibrables par env
    # (recette sur corpus réel ; abaissés en CI e2e — embeddeur déterministe).
    ai_seuil_pertinence: float = 0.45
    ai_seuil_suggestion: float = 0.40
    ai_seuil_confiance_forte: float = 0.55
    # Dictée opt-in (R5 D5, ADR-004 §5) : « off » (défaut — endpoint refuse
    # proprement), « locale » (faster-whisper, CPU) ou « deterministe » (CI).
    ai_transcription: str = "off"
    ai_transcription_model: str = "small"  # tiny|base|small|medium|large-v3

    model_config = {"env_prefix": "", "case_sensitive": False}


def charger_reglages() -> Reglages:
    reglages = Reglages()
    # asyncpg ne comprend pas le paramètre ?schema= de Prisma
    if "?" in reglages.database_url:
        reglages.database_url = reglages.database_url.split("?")[0]
    # Même philosophie que l'API NestJS : une config invalide refuse de booter.
    if reglages.ai_generation not in ("off", "api"):
        raise ValueError("AI_GENERATION doit valoir « off » ou « api »")
    if reglages.ai_generation == "api" and not reglages.ai_api_key:
        raise ValueError("AI_GENERATION=api exige AI_API_KEY (voir ADR-004 §3)")
    if reglages.ai_transcription not in ("off", "locale", "deterministe"):
        raise ValueError("AI_TRANSCRIPTION doit valoir « off », « locale » ou « deterministe »")
    return reglages
