from __future__ import annotations

import os
from dataclasses import dataclass
from pathlib import Path

from dotenv import load_dotenv

ROOT = Path(__file__).resolve().parents[1]


@dataclass(frozen=True)
class Settings:
    llm_provider: str
    anthropic_api_key: str
    claude_model: str
    openai_api_key: str
    openai_model: str
    openai_image_model: str
    openai_video_model: str
    video_engine: str
    enable_ai_images: bool
    enable_audio: bool
    telegram_bot_token: str
    telegram_chat_id: str
    google_service_account_file: Path
    google_oauth_client_secrets: Path
    google_oauth_token_file: Path
    google_drive_folder_id: str
    google_use_shared_drive: bool
    content_locale: str
    batch_size: int
    enable_video: bool
    video_max_seconds: int
    brand_primary: str
    brand_accent: str
    brand_bg: str
    brand_name: str
    output_dir: Path
    dry_run: bool
    data_erp: Path
    data_profiles: Path
    storage_tmp: Path
    storage_logs: Path


def _path_from_env(name: str, default: str) -> Path:
    raw = (os.getenv(name) or default).strip()
    path = Path(raw)
    return path if path.is_absolute() else ROOT / path


def load_settings(env_file: Path | None = None) -> Settings:
    load_dotenv(env_file or (ROOT / ".env"))

    provider = (os.getenv("LLM_PROVIDER") or "openai").strip().lower()
    anthropic_key = os.getenv("ANTHROPIC_API_KEY", "").strip()
    openai_key = os.getenv("OPENAI_API_KEY", "").strip()

    if provider == "openai" and not openai_key:
        raise RuntimeError("Missing required env var: OPENAI_API_KEY")
    if provider == "claude" and not anthropic_key:
        raise RuntimeError("Missing required env var: ANTHROPIC_API_KEY (or set LLM_PROVIDER=openai)")

    output = Path(os.getenv("OUTPUT_DIR", "storage/runs"))
    if not output.is_absolute():
        output = ROOT / output

    return Settings(
        llm_provider=provider,
        anthropic_api_key=anthropic_key,
        claude_model=os.getenv("CLAUDE_MODEL", "claude-sonnet-4-5-20250929"),
        openai_api_key=openai_key,
        openai_model=os.getenv("OPENAI_MODEL", "gpt-4o"),
        openai_image_model=os.getenv("OPENAI_IMAGE_MODEL", "dall-e-3"),
        openai_video_model=os.getenv("OPENAI_VIDEO_MODEL", "sora-2"),
        video_engine=os.getenv("VIDEO_ENGINE", "sora").strip().lower(),
        enable_ai_images=os.getenv("ENABLE_AI_IMAGES", "true").lower() in ("1", "true", "yes"),
        enable_audio=os.getenv("ENABLE_AUDIO", "false").lower() in ("1", "true", "yes"),
        telegram_bot_token=os.getenv("TELEGRAM_BOT_TOKEN", "").strip(),
        telegram_chat_id=os.getenv("TELEGRAM_CHAT_ID", "").strip(),
        google_service_account_file=_path_from_env(
            "GOOGLE_SERVICE_ACCOUNT_FILE", "config/google_service_account.json"
        ),
        google_oauth_client_secrets=_path_from_env(
            "GOOGLE_OAUTH_CLIENT_SECRETS", "config/google_oauth_client.json"
        ),
        google_oauth_token_file=_path_from_env(
            "GOOGLE_OAUTH_TOKEN_FILE", "config/google_token.json"
        ),
        google_drive_folder_id=os.getenv("GOOGLE_DRIVE_FOLDER_ID", "").strip(),
        google_use_shared_drive=os.getenv("GOOGLE_USE_SHARED_DRIVE", "false").lower()
        in ("1", "true", "yes"),
        content_locale=os.getenv("CONTENT_LOCALE", "en"),
        batch_size=max(1, int(os.getenv("BATCH_SIZE", "3"))),
        enable_video=os.getenv("ENABLE_VIDEO", "true").lower() in ("1", "true", "yes"),
        video_max_seconds=int(os.getenv("VIDEO_MAX_SECONDS", "18")),
        brand_primary=os.getenv("BRAND_PRIMARY_COLOR", "#1a365d"),
        brand_accent=os.getenv("BRAND_ACCENT_COLOR", "#ed8936"),
        brand_bg=os.getenv("BRAND_BG_COLOR", "#0f172a"),
        brand_name=os.getenv("BRAND_NAME", "Brand"),
        output_dir=output,
        dry_run=os.getenv("DRY_RUN", "false").lower() in ("1", "true", "yes"),
        data_erp=ROOT / "data" / "erp",
        data_profiles=ROOT / "data" / "profiles",
        storage_tmp=ROOT / "storage" / "tmp",
        storage_logs=ROOT / "storage" / "logs",
    )
