from functools import lru_cache
from pathlib import Path

from pydantic_settings import BaseSettings, SettingsConfigDict

ROOT_DIR = Path(__file__).resolve().parents[3]
DATA_DIR = ROOT_DIR / "data"


class Settings(BaseSettings):
    model_config = SettingsConfigDict(
        env_file=str(ROOT_DIR / ".env"),
        env_file_encoding="utf-8",
        extra="ignore",
    )

    secret_key: str = "dev-secret-change-me-jobsworld-local"
    database_url: str = f"sqlite:///{(DATA_DIR / 'jobsworld.db').as_posix()}"
    access_token_expire_minutes: int = 60 * 24 * 7

    admin_email: str = "admin@jobsworld.local"
    admin_password: str = "admin123"
    admin_name: str = "Admin"

    llm_provider: str = "ollama"  # ollama | openai | fcc | cursor | auto
    openai_api_key: str = ""
    openai_base_url: str = "https://api.openai.com/v1"
    openai_model: str = "gpt-4o-mini"
    # Lab IA .16 (Docker Ollama)
    ollama_base_url: str = "http://192.168.1.16:11434/v1"
    ollama_model: str = "qwen2.5:3b"

    # FCC proxy local (opcional)
    fcc_base_url: str = "http://127.0.0.1:8082/v1"
    fcc_api_key: str = ""
    fcc_model: str = "auto"

    # Cursor mobile bridge (agente Cursor para CV premium)
    cursor_api_enabled: bool = True
    cursor_bridge_url: str = "http://127.0.0.1:8095"
    cursor_bridge_token: str = ""
    cursor_bridge_project: str = "JobsWorld"
    cursor_bridge_timeout_sec: int = 180

    scrape_interval_minutes: int = 120
    user_agent: str = "JobsWorld/1.0 (personal job aggregator)"

    apply_auto_submit: bool = False
    playwright_headless: bool = False

    # Stripe (opcional — cobros admin-first si vacío)
    stripe_secret_key: str = ""
    stripe_webhook_secret: str = ""
    stripe_publishable_key: str = ""

    # URL pública para UTM / Open Graph (ej. http://100.78.198.98:8010)
    public_base_url: str = ""

    # Telegram bot (opcional — stub si vacío)
    telegram_bot_token: str = ""
    telegram_enabled: bool = False

    # JobsWorld API port (do NOT use 8000 by default — often taken by other local apps)
    api_host: str = "127.0.0.1"
    api_port: int = 8010

    cors_origins: str = "http://localhost:5173,http://127.0.0.1:5173,http://localhost"

    @property
    def cors_origin_list(self) -> list[str]:
        return [o.strip() for o in self.cors_origins.split(",") if o.strip()]

    @property
    def data_dir(self) -> Path:
        DATA_DIR.mkdir(parents=True, exist_ok=True)
        (DATA_DIR / "cvs").mkdir(exist_ok=True)
        (DATA_DIR / "exports").mkdir(exist_ok=True)
        return DATA_DIR

    def resolved_database_url(self) -> str:
        url = self.database_url
        if url.startswith("sqlite:///./"):
            rel = url.replace("sqlite:///./", "", 1)
            return f"sqlite:///{(ROOT_DIR / rel).as_posix()}"
        if url == "sqlite:///./data/jobsworld.db" or url.endswith("data/jobsworld.db"):
            return f"sqlite:///{(DATA_DIR / 'jobsworld.db').as_posix()}"
        return url


@lru_cache
def get_settings() -> Settings:
    return Settings()
