from __future__ import annotations
from functools import cached_property

from pydantic import model_validator
from pydantic_settings import BaseSettings, SettingsConfigDict


class Settings(BaseSettings):
    APP_NAME: str = "Odisha Fire & Emergency Services, Procurement Tracking System"
    ENVIRONMENT: str = "local"
    SECRET_KEY: str = "change-this-secret-key-before-production"
    ALGORITHM: str = "HS256"
    ACCESS_TOKEN_EXPIRE_MINUTES: int = 30
    BACKEND_CORS_ORIGINS: str = "http://localhost:4200,http://127.0.0.1:4200"
    DATABASE_URL: str = "mysql+pymysql://root:password@127.0.0.1:3306/procurement_tracking_db"
    DATABASE_POOL_RECYCLE_SECONDS: int = 280

    model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8")

    @cached_property
    def cors_origins(self) -> list[str]:
        return [origin.strip() for origin in self.BACKEND_CORS_ORIGINS.split(",") if origin.strip()]

    @model_validator(mode="after")
    def validate_production_settings(self) -> "Settings":
        if self.ENVIRONMENT.lower() != "production":
            return self
        placeholder_secrets = {
            "change-this-secret-key-before-production",
            "replace-with-at-least-32-random-characters",
        }
        if self.SECRET_KEY in placeholder_secrets or len(self.SECRET_KEY) < 32:
            raise ValueError("Production SECRET_KEY must be replaced with at least 32 random characters.")
        if (
            self.DATABASE_URL == "mysql+pymysql://root:password@127.0.0.1:3306/procurement_tracking_db"
            or "URL_ENCODED_PASSWORD" in self.DATABASE_URL
        ):
            raise ValueError("Production DATABASE_URL must be configured for the hosting MySQL database.")
        return self


settings = Settings()
