from typing import Optional
from pydantic import Field
from pydantic_settings import BaseSettings, SettingsConfigDict

class Settings(BaseSettings):
    # App Settings
    PROJECT_NAME: str = "Silvia Premium Jewelry"
    API_V1_STR: str = "/api/v1"
    SECRET_KEY: str = Field(default="SUPER_SECRET_JWL_KEY_FOR_LOCAL_DEV_CHANGE_IN_PROD")
    ACCESS_TOKEN_EXPIRE_MINUTES: int = 60 * 24 * 7  # 7 Days

    # Database Settings
    USE_SQLITE: bool = True  # Set True untuk development lokal tanpa PostgreSQL/Docker
    POSTGRES_SERVER: str = "localhost"
    POSTGRES_USER: str = "commerce_user"
    POSTGRES_PASSWORD: str = "commerce_secure_password"
    POSTGRES_DB: str = "commerce_db"
    POSTGRES_PORT: str = "3306" # Default MySQL Port

    # Mengizinkan field DATABASE_URL secara eksplisit agar Pydantic tidak memblokirnya
    DATABASE_URL: Optional[str] = Field(default=None)

    @property
    def GET_DATABASE_URL(self) -> str:
        if self.DATABASE_URL:
            return self.DATABASE_URL
        if self.USE_SQLITE:
            return "sqlite:///./commerce.db"
        return f"mysql+pymysql://{self.POSTGRES_USER}:{self.POSTGRES_PASSWORD}@{self.POSTGRES_SERVER}:{self.POSTGRES_PORT}/{self.POSTGRES_DB}"

    @property
    def GET_ASYNC_DATABASE_URL(self) -> str:
        if self.DATABASE_URL:
            return self.DATABASE_URL
        if self.USE_SQLITE:
            return "sqlite:///./commerce.db"
        return f"mysql+pymysql://{self.POSTGRES_USER}:{self.POSTGRES_PASSWORD}@{self.POSTGRES_SERVER}:{self.POSTGRES_PORT}/{self.POSTGRES_DB}"

    # Storage Settings
    STORAGE_PROVIDER: str = "minio"  # 'minio' or 's3'
    AWS_ACCESS_KEY_ID: str = "minio_admin"
    AWS_SECRET_ACCESS_KEY: str = "minio_secure_password"
    AWS_S3_BUCKET: str = "jewelry-media"
    AWS_S3_ENDPOINT_URL: Optional[str] = "http://localhost:9000"  # Kosongkan jika pakai AWS S3 asli

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

settings = Settings()
