"""
Application Configuration — all values from .env
"""
import os
from pydantic_settings import BaseSettings
from typing import List

# Resolve project root regardless of where uvicorn is started from
_ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))


class Config(BaseSettings):
    # App
    HOST: str = "0.0.0.0"
    PORT: int = 8000
    DEBUG: bool = True

    # Static admin (no registration)
    ADMIN_USERNAME: str = "admin"
    ADMIN_PASSWORD: str = "admin123"

    # JWT
    JWT_SECRET: str = "gols-change-this-in-production"
    JWT_ALGORITHM: str = "HS256"
    JWT_EXPIRE_MINUTES: int = 480

    # CORS
    CORS_ORIGINS: List[str] = [
        "http://localhost:8000",
        "http://127.0.0.1:8000",
    ]

    # Storage — absolute paths resolved from project root
    DATA_DIR:   str = os.path.join(_ROOT, "backend", "data")
    UPLOAD_DIR: str = os.path.join(_ROOT, "backend", "uploads")
    OUTPUT_DIR: str = os.path.join(_ROOT, "backend", "outputs")

    # AI Engine paths (set to your installed model locations)
    FFMPEG_PATH:        str = "ffmpeg"
    PIPER_MODEL:        str = os.path.join(_ROOT, "models", "piper", "en_US-ryan-high.onnx")
    XTTS_URL:           str = "http://localhost:5002"
    LIVEPORTRAIT_PATH:  str = os.path.join(_ROOT, "models", "liveportrait")
    WAV2LIP_PATH:       str = os.path.join(_ROOT, "models", "wav2lip")
    MUSETALK_PATH:      str = os.path.join(_ROOT, "models", "musetalk")
    CODEFORMER_PATH:    str = os.path.join(_ROOT, "models", "codeformer")
    # Auto-patch Wav2Lip source for modern librosa/numpy (no manual edits needed)
    WAV2LIP_AUTOPATCH:  bool = True

    # Python interpreter used to invoke the model CLIs (their own venv ideally)
    MODELS_PYTHON:      str = "python"

    # ── OpenAI (primary language + voice engine) ──────────────────────────
    OPENAI_API_KEY:     str = ""
    OPENAI_BASE_URL:    str = ""                       # optional override / Azure proxy
    OPENAI_TEXT_MODEL:  str = "gpt-4o-mini"            # script intelligence
    OPENAI_TTS_MODEL:   str = "gpt-4o-mini-tts"        # speech synthesis
    OPENAI_MAX_TOKENS:  int = 1200
    OPENAI_TEMPERATURE: float = 0.7
    OPENAI_TIMEOUT:     int = 60

    # Default OpenAI TTS voices mapped to gender (override per-project)
    OPENAI_VOICE_MALE:   str = "onyx"                  # male timbre
    OPENAI_VOICE_FEMALE: str = "shimmer"               # female timbre

    # ── Avatar "liveness" (CPU FFmpeg fallback when GPU models absent) ─────
    ENABLE_LIVENESS:    bool = True                    # Ken-Burns motion + blink

    # ── Watermark (clean text, HeyGen-style) ──────────────────────────────
    WATERMARK_TEXT:     str = "GOLS"                   # the text burned into videos
    WATERMARK_OPACITY:  float = 0.45                   # 0.0 – 1.0
    WATERMARK_POSITION: str = "bottom-right"           # top-left|top-right|bottom-left|bottom-right|center
    WATERMARK_SCALE:    float = 0.16                   # (kept for compatibility)

    # External APIs (optional)
    ELEVENLABS_KEY: str = ""
    HEYGEN_KEY:     str = ""
    DID_KEY:        str = ""

    class Config:
        env_file = ".env"
        env_file_encoding = "utf-8"


cfg = Config()
