import os
import secrets
from typing import Optional
from pydantic import AnyHttpUrl
from pydantic_settings import BaseSettings, SettingsConfigDict


class Settings(BaseSettings):
    APP_TITLE: str = "Wine-Match"
    APP_DESCRIPTION: str = "Wine-Match API Setup"
    APP_VERSION: str = "0.1.0"
    DEBUG: bool = True
    POOL_SIZE: int = 30
    MAX_POOL_OVERFLOW: int = 20
    CORS_ORIGINS: str = "*"

    # Database
    DATABASE_HOST: str
    DATABASE_PORT: int
    DATABASE_NAME: str
    DATABASE_USERNAME: str
    DATABASE_PASSWORD: str
    
    # JWT
    JWT_SECRET: str = "your-secret-key"
    JWT_ALGORITHM: str = "HS256"
    JWT_EXPIRATION: int = 3600  # in seconds
    JWT_REMEMBER_ME_ACCESS_EXP: int = 30 * 24 * 3600  # 30 days, configurable from env
    JWT_REMEMBER_ME_REFRESH_EXP: int = 60 * 24 * 3600  # 60 days, configurable from env
    JWT_RESET_PASSWORD_EXP: int = 15 * 60  # 15 minutes, configurable from env
    
    # File uploads
    UPLOADS_DIR: str = "/uploads"
    STATIC_FILES_PATH: str = "/uploads"
    
    SERVER_HOST: AnyHttpUrl
    SERVER_FRONT: AnyHttpUrl
    DEFAULT_SITE_HOST: str = ""
    DEFAULT_ADMIN_SITE_HOST: str = ""
    
    JWT_ACCESS_TOKEN_EXPIRE_MINUTES: str = 3600
    JWT_PASSWORD_TOKEN: str = secrets.token_urlsafe(32)
    
    model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8")

    def getDbConnectionUri(self) -> str:
        return f"postgresql+psycopg2://{self.DATABASE_USERNAME}:{self.DATABASE_PASSWORD}@{self.DATABASE_HOST}:{self.DATABASE_PORT}/{self.DATABASE_NAME}"

    def api_base_url(self) -> str:  
        return str(self.SERVER_HOST)+ "api/v1"

settings = Settings()