"""
Nom du script : config.py
Chemin : /gitlab-bridge/app/core/config.py
Description : Configuration centralisée de l'application GitLab Bridge via variables d'environnement.
Options éventuelles : Aucune.
Exemples d'utilisation : Importer `settings` depuis ce module.
Prérequis : Python 3.11+, pydantic-settings.
Auteur : Sylvain SCATTOLINI
Date de création / modification : 2026-03-25
Version : 1.1
"""

from __future__ import annotations

from functools import lru_cache

from pydantic import AnyHttpUrl, Field
from pydantic_settings import BaseSettings, SettingsConfigDict


class Settings(BaseSettings):
    """Paramètres applicatifs chargés depuis l'environnement."""

    model_config = SettingsConfigDict(
        env_file='.env',
        env_file_encoding='utf-8',
        case_sensitive=False,
        extra='ignore',
    )

    app_name: str = Field(default='gitlab-bridge', alias='APP_NAME')
    app_env: str = Field(default='dev', alias='APP_ENV')
    app_debug: bool = Field(default=False, alias='APP_DEBUG')
    app_host: str = Field(default='0.0.0.0', alias='APP_HOST')
    app_port: int = Field(default=8080, alias='APP_PORT')

    gitlab_base_url: AnyHttpUrl = Field(alias='GITLAB_BASE_URL')
    gitlab_api_token: str = Field(min_length=8, alias='GITLAB_API_TOKEN')
    gitlab_timeout: int = Field(default=15, ge=3, le=120, alias='GITLAB_TIMEOUT')
    gitlab_verify_ssl: bool = Field(default=True, alias='GITLAB_VERIFY_SSL')

    cors_origins: list[str] = Field(
        default=['https://ia.tarbouriech.tech'],
        alias='CORS_ORIGINS',
    )

    db_host: str = Field(alias='DB_HOST')
    db_port: int = Field(default=3306, alias='DB_PORT')
    db_name: str = Field(alias='DB_NAME')
    db_user: str = Field(alias='DB_USER')
    db_password: str = Field(alias='DB_PASSWORD')
    db_echo: bool = Field(default=False, alias='DB_ECHO')

    @property
    def sqlalchemy_database_url(self) -> str:
        """Construit l'URL SQLAlchemy MariaDB/PyMySQL."""
        return (
            f"mysql+pymysql://{self.db_user}:{self.db_password}@"
            f"{self.db_host}:{self.db_port}/{self.db_name}?charset=utf8mb4"
        )


@lru_cache(maxsize=1)
def get_settings() -> Settings:
    """Retourne une instance singleton des paramètres."""
    return Settings()


settings = get_settings()
