from functools import lru_cache
from pathlib import Path

from pydantic import PostgresDsn, field_validator
from pydantic_settings import BaseSettings, SettingsConfigDict


class Settings(BaseSettings):
    model_config = SettingsConfigDict(env_file=".env", extra="forbid")

    database_url: PostgresDsn
    auth_base_url: str  # URL publique de web/ (issuer + audience des JWT)
    # Racine des fichiers d'import sur disque (spec Imports §3.12) : `<org_id>/<sha256>.csv`
    # et le `<sha256>.errors.csv` que le job génère. Rétention ~30 jours, exclue des backups
    # (décision n°7) — les fichiers appartiennent aux clients de l'organisation.
    # Défaut dev-safe (répertoire utilisateur) ; la prod Dedibox DOIT poser
    # IMPORT_FILES_DIR=/var/lib/seoinsight/imports via l'environnement (pre-prod-checklist).
    import_files_dir: Path = Path.home() / ".local/share/seoinsight/imports"
    # Clé Fernet du chiffrement applicatif des secrets d'intégration BYOK (architecture §7 :
    # « chiffré (Fernet, clé en env) et stocké dans DATA »). Optionnelle ici, **exigée au
    # premier usage** par `app.core.crypto` : un déploiement qui ne branche aucune intégration
    # doit démarrer sans elle, celui qui en branche une doit échouer avec une phrase claire.
    # La prod DOIT la poser (pre-prod-checklist) — sans elle, aucune clé client n'est lisible.
    credentials_key: str | None = None
    # Racine de l'API Mangools (BYOK, spec Imports §5). Réglable pour pointer un bouchon en
    # test : jamais d'appel réseau sortant dans la suite.
    mangools_api_base_url: str = "https://api.mangools.com/v3"

    # Normalisé une fois : une barre finale ferait échouer la comparaison de `iss`/`aud`.
    @field_validator("auth_base_url")
    @classmethod
    def _strip_trailing_slash(cls, value: str) -> str:
        return value.rstrip("/")

    @property
    def jwks_url(self) -> str:
        return f"{self.auth_base_url}/api/auth/jwks"


@lru_cache
def get_settings() -> Settings:
    return Settings()
