from pydantic_settings import BaseSettings, SettingsConfigDict
from pydantic import AnyHttpUrl, field_validator, Field
from typing import List, Union, Optional
import json
import os
from dotenv import load_dotenv
load_dotenv()

class Settings(BaseSettings):
    # ---- App ----
    APP_NAME: str = os.getenv("APP_NAME")
    APPLE_LOGIN: str = os.getenv("APPLE_LOGIN")
    GOOGLE_LOGIN: str = os.getenv("GOOGLE_LOGIN")
    DELETEUSER: str = os.getenv("DELETEUSER")
    APP_ENV: str = "development"
    APP_DEBUG: bool = True
    API_PREFIX: str = "/v1"
    TZ: str = "Asia/Kolkata"

    # ---- Security (JWT etc.) ----
    JWT_SECRET: str = Field(..., alias="JWT_KEY") 
    JWT_EXPIRE_MINUTES: int = Field(604800, alias="JWT_EXPIRE_CLAIM")

    # ---- Crypto (AES) ----
    AES_KEY : str = os.getenv("AES_KEY")
    AES_IV : str = os.getenv("AES_IV")

    # ---- CORS ----
    CORS_ORIGINS: List[Union[AnyHttpUrl, str]] = ["*"]

    # ---- Database (MySQL) ----
    # Option A: pass a full URI (preferred in prod)
    SQLALCHEMY_DATABASE_URI: Optional[str] = None
    # Option B: split creds (used if URI not provided)
    DB_HOST: str = os.getenv("DB_HOST")
    DB_PORT: int = os.getenv("DB_PORT")
    DB_USER: str = os.getenv("DB_USER")
    DB_PASSWORD: str = os.getenv("DB_PASSWORD")
    DB_NAME: str = os.getenv("DB_NAME")

    # ---- subscription service ----
    secret: str = os.getenv("SUBSCRIPTION_SECRET")

    # ---- s3 ----
    CLOUDINARY_BUCKET_NAME :str = os.getenv("CLOUDINARY_BUCKET_NAME")
    CLOUDINARY_API_KEY : str = os.getenv("CLOUDINARY_API_KEY")
    CLOUDINARY_API_SECRET : str = os.getenv("CLOUDINARY_API_SECRET")
    CLOUD_FRONT_URL : str = os.getenv("CLOUD_FRONT_URL")

    # ---- Background Removal Service ----
    BACKGROUND_API_KEY : str = os.getenv("BACKGROUND_API_KEY")
    BACKGROUND_API_SECRET : str = os.getenv("BACKGROUND_API_SECRET")

    # ---- android plan ----- 
    ANDROID_PLANS: List[str] = json.loads(os.getenv("ANDROID_PLAN_IDS", "[]"))
    IOS_PLANS: List[str] = json.loads(os.getenv("IOS_PLAN_IDS", "[]"))

    appstore_receipt_validator_url_prod: str = os.getenv("APPSTORE_RECEIPT_VALIDATOR_URL_PROD")
    appstore_receipt_validator_url_sandbox: str = os.getenv("APPSTORE_RECEIPT_VALIDATOR_URL_SANDBOX")
    sandbox_secret: str = os.getenv("SANDBOX_SECRET")
    itunes_secret: str = os.getenv("ITUNES_SECRET")

    # ---- ios -----
    ISO_PKG : str = os.getenv("IOS_PKG_NAME")

    SQLALCHEMY_ECHO: bool = False
    POOL_SIZE: int = 10
    POOL_MAX_OVERFLOW: int = 20
    POOL_TIMEOUT: int = 30  # seconds

    # ---- Logging ----
    LOG_DIR: str = "logs"
    LOG_LEVEL: str = "INFO"
    LOG_RETENTION_DAYS: int = 10

    model_config = SettingsConfigDict(
        env_file=os.getenv("ENV_FILE", ".env"),
        env_file_encoding="utf-8",
        case_sensitive=False,
        extra="ignore",
    )

    @field_validator("CORS_ORIGINS", mode="before")
    @classmethod
    def parse_cors(cls, v):
        if isinstance(v, str):
            try:
                return json.loads(v)
            except Exception:
                return [s.strip() for s in v.split(",") if s.strip()]
        return v

    @property
    def DATABASE_URL(self) -> str:
        """
        Prefer an explicit SQLALCHEMY_DATABASE_URI from env.
        Otherwise, build a mysql+aiomysql DSN.
        """
        if self.SQLALCHEMY_DATABASE_URI:
            return self.SQLALCHEMY_DATABASE_URI
        return (
            f"mysql+aiomysql://{self.DB_USER}:{self.DB_PASSWORD}"
            f"@{self.DB_HOST}:{self.DB_PORT}/{self.DB_NAME}"
            f"?charset=utf8mb4"
        )

settings = Settings()
