# #region AuthConfigModule [C:2] [TYPE Module] [SEMANTICS pydantic, auth, auth-config, config]
#
# @BRIEF Centralized configuration for authentication and authorization.
# @LAYER     Core
# @RELATION DEPENDS_ON -> [EXT:Library:pydantic]
#
# @INVARIANT  All sensitive configuration must be loaded from environment; no hardcoded secrets.
# @RATIONALE SECRET_KEY and AUTH_DATABASE_URL crash-early if env vars are missing.
#            Dev fallback for AUTH_DATABASE_URL removed — Class 1 violation restored.
# @REJECTED Default secrets in source code rejected — Class 1 security violation:
#           "super-secret-key-change-in-production" and "postgres:postgres" exposed
#           secrets in version control. DEV_MODE fallback for AUTH_DATABASE_URL removed
#           in [SEC:C-4] — hardcoded postgres:postgres is a clear-text credential leak.

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


# #region AuthConfig [TYPE Class]
# @BRIEF Holds authentication-related settings.
# @PRE      Environment variables may be provided via .env file.
# @POST     Returns a configuration object with validated settings.
# @RELATION INHERITS -> [EXT:Library:pydantic_settings.BaseSettings]
class AuthConfig(BaseSettings):
    model_config = SettingsConfigDict(env_file=".env", extra="ignore")

    # JWT Settings
    SECRET_KEY: str = Field(default="", validation_alias="AUTH_SECRET_KEY")
    ALGORITHM: str = "HS256"
    ACCESS_TOKEN_EXPIRE_MINUTES: int = 480
    REFRESH_TOKEN_EXPIRE_DAYS: int = 7
    JWT_AUDIENCE: str = Field(default="ss-tools-api", validation_alias="JWT_AUDIENCE")
    JWT_ISSUER: str = Field(default="ss-tools", validation_alias="JWT_ISSUER")

    # Database Settings
    AUTH_DATABASE_URL: str = Field(default="", validation_alias="AUTH_DATABASE_URL")

    # ADFS Settings
    ADFS_CLIENT_ID: str = Field(default="", validation_alias="ADFS_CLIENT_ID")
    ADFS_CLIENT_SECRET: str = Field(default="", validation_alias="ADFS_CLIENT_SECRET")
    ADFS_METADATA_URL: str = Field(default="", validation_alias="ADFS_METADATA_URL")

    @field_validator("SECRET_KEY", mode="after")
    @classmethod
    def validate_secret_key(cls, v: str) -> str:
        if v:
            return v
        raise ValueError(
            "AUTH_SECRET_KEY environment variable is required. "
            "Set it in .env or export it before starting the server."
        )

    @field_validator("AUTH_DATABASE_URL", mode="after")
    @classmethod
    def validate_auth_db_url(cls, v: str) -> str:
        if v:
            return v
        raise ValueError(
            "AUTH_DATABASE_URL environment variable is required. "
            "Set it in .env or export it before starting the server. "
            "For local development, create a .env file with AUTH_DATABASE_URL=postgresql+psycopg2://... "
            "or use docker-compose.yml with pre-configured PostgreSQL."
        )

# #endregion AuthConfig

# #region auth_config [TYPE Variable]
# @BRIEF Singleton instance of AuthConfig.
# @RELATION DEPENDS_ON -> AuthConfig
auth_config = AuthConfig()
# #endregion auth_config

# #endregion AuthConfigModule
