from pydantic_settings import BaseSettings, SettingsConfigDict


class Settings(BaseSettings):
    model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8", extra="ignore")

    DB_CONNECTION: str = "mysql"
    DB_HOST: str = "127.0.0.1"
    DB_PORT: int = 3306
    DB_DATABASE: str = "accounting"
    DB_USERNAME: str = "root"
    DB_PASSWORD: str = ""

    APP_TITLE: str = "Accounting API"
    APP_VERSION: str = "1.0.0"
    API_V1_PREFIX: str = "/api/v1"

    JWT_SECRET_KEY: str = "change-this-secret-key-in-production"
    JWT_ALGORITHM: str = "HS256"
    ACCESS_TOKEN_EXPIRE_MINUTES: int = 60
    REFRESH_TOKEN_EXPIRE_DAYS: int = 7

    CORS_ORIGINS: str = (
        "http://localhost:8098,"
        "http://127.0.0.1:8098,"
        "http://localhost:5174,"
        "http://127.0.0.1:5174"
    )

    LLM_API_KEY: str = ""
    LLM_BASE_URL: str = "https://api.openai.com/v1"
    LLM_MODEL: str = "gpt-4o-mini"

    RECAPTCHA_SITE_KEY: str = ""
    RECAPTCHA_SECRET_KEY: str = ""
    RECAPTCHA_MIN_SCORE: float = 0.5
    RECAPTCHA_ENABLED: bool = True

    @property
    def cors_origins(self) -> list[str]:
        return [origin.strip() for origin in self.CORS_ORIGINS.split(",") if origin.strip()]

    @property
    def database_url(self) -> str:
        """Async SQLAlchemy URL for MySQL."""
        password = self.DB_PASSWORD.replace("@", "%40").replace("*", "%2A")
        return (
            f"mysql+aiomysql://{self.DB_USERNAME}:{password}"
            f"@{self.DB_HOST}:{self.DB_PORT}/{self.DB_DATABASE}?charset=utf8mb4"
        )

    @property
    def database_url_sync(self) -> str:
        """Sync SQLAlchemy URL for Alembic migrations."""
        password = self.DB_PASSWORD.replace("@", "%40").replace("*", "%2A")
        return (
            f"mysql+pymysql://{self.DB_USERNAME}:{password}"
            f"@{self.DB_HOST}:{self.DB_PORT}/{self.DB_DATABASE}?charset=utf8mb4"
        )


settings = Settings()
