from pydantic_settings import BaseSettings
from typing import Optional

# -----------------------------
# Base service config class
# -----------------------------
class BaseServiceSettings(BaseSettings):
    class Config:
        env_file = ".env"
        env_file_encoding = "utf-8"
        case_sensitive = False  


# -----------------------------
# DB Config
# -----------------------------
class DBSettings(BaseServiceSettings):
    database_url: str
    pool_size: int = 10
    echo: bool = False  

    class Config(BaseServiceSettings.Config):
        env_prefix = "DB_" 
        extra = "ignore"


# # -----------------------------
# # Redis Config
# # -----------------------------
# class RedisSettings(BaseServiceSettings):
#     url: str = "redis://localhost:6379/0"
#     ttl_seconds: int = 3600

#     class Config(BaseServiceSettings.Config):
#         env_prefix = "REDIS_"


# # -----------------------------
# # Search Service Config (Elastic, etc.)
# # -----------------------------
# class SearchSettings(BaseServiceSettings):
#     host: str = "localhost"
#     port: int = 9200
#     username: Optional[str] = None
#     password: Optional[str] = None
#     index_name: str = "tiles"

#     class Config(BaseServiceSettings.Config):
#         env_prefix = "SEARCH_"


# -----------------------------
# App / General Config
# -----------------------------
class AppSettings(BaseServiceSettings):
    app_name: str = "Tile Generator API"
    debug: bool = True
    scraper_url: str = "http://localhost:8080/api/v1/jobs"
    port: int = 8000

    class Config(BaseServiceSettings.Config):
        env_prefix = "APP_"
        extra = "ignore"

class MongoSettings(BaseServiceSettings):
    uri: str = "mongodb://localhost:27017"
    db: str = "marketing_ai"
    collection: str = "campaign_runs"

    class Config(BaseServiceSettings.Config):
        env_prefix = "MONGO_"
        extra = "ignore"

class GeminiSettings(BaseServiceSettings):
    api_key: str = ""

    class Config(BaseServiceSettings.Config):
        env_prefix = "GOOGLE_"
        extra = "ignore"

class N8NSettings(BaseServiceSettings):
    webhook_url: str = ""

    class Config(BaseServiceSettings.Config):
        env_prefix = "N8N_"
        extra = "ignore"

class StadiaSettings(BaseServiceSettings):
    map_api_key: str = ""

    class Config(BaseServiceSettings.Config):
        env_prefix = "STADIA_"
        extra = "ignore"

class AuthSettings(BaseServiceSettings):
    secret_key: str = "09d25e094faa6ca2556c818166b7a9563b93f7099f6f0f4caa6cf63b88e8d3e7"
    algorithm: str = "HS256"
    access_token_expire_minutes: int = 1440
    collection: str = "users"

    class Config(BaseServiceSettings.Config):
        env_prefix = "AUTH_"
        extra = "ignore"

class WoodpeckerSettings(BaseServiceSettings):
    api_key: str = ""
    base_url: str = "https://api.woodpecker.co/rest"
    cc: Optional[str] = None
    bcc: Optional[str] = None

    class Config(BaseServiceSettings.Config):
        env_prefix = "WOODPECKER_"
        extra = "ignore"


# -----------------------------
# Singleton instances
# -----------------------------
app_settings = AppSettings()
mongo_settings = MongoSettings()
db_settings = DBSettings()
gemini_settings = GeminiSettings()
n8n_settings = N8NSettings()
stadia_settings = StadiaSettings()
auth_settings = AuthSettings()
woodpecker_settings = WoodpeckerSettings()
# redis_settings = RedisSettings()
# search_settings = SearchSettings()