"""
Kiwi application config.
Uses circuitforge-core for env loading; no pydantic-settings dependency.
"""
from __future__ import annotations

import os
from pathlib import Path

from circuitforge_core.config.settings import load_env

# Load .env from the repo root (two levels up from app/core/)
_ROOT = Path(__file__).resolve().parents[2]
load_env(_ROOT / ".env")


class Settings:
    # API
    API_PREFIX: str = os.environ.get("API_PREFIX", "/api/v1")
    PROJECT_NAME: str = "Kiwi — Pantry Intelligence"

    # CORS
    CORS_ORIGINS: list[str] = [
        o.strip()
        for o in os.environ.get("CORS_ORIGINS", "").split(",")
        if o.strip()
    ]

    # File storage
    DATA_DIR: Path = Path(os.environ.get("DATA_DIR", str(_ROOT / "data")))
    UPLOAD_DIR: Path = DATA_DIR / "uploads"
    PROCESSING_DIR: Path = DATA_DIR / "processing"
    ARCHIVE_DIR: Path = DATA_DIR / "archive"

    # Database
    DB_PATH: Path = Path(os.environ.get("DB_PATH", str(DATA_DIR / "kiwi.db")))

    # Pre-computed browse counts cache (small SQLite, separate from corpus).
    # Written by the nightly refresh task and by infer_recipe_tags.py.
    # Set BROWSE_COUNTS_PATH to a bind-mounted path if you want the host
    # pipeline to share counts with the container without re-running FTS.
    BROWSE_COUNTS_PATH: Path = Path(
        os.environ.get("BROWSE_COUNTS_PATH", str(DATA_DIR / "browse_counts.db"))
    )

    # Community feature settings
    COMMUNITY_DB_URL: str | None = os.environ.get("COMMUNITY_DB_URL") or None
    COMMUNITY_PSEUDONYM_SALT: str = os.environ.get(
        "COMMUNITY_PSEUDONYM_SALT", "kiwi-default-salt-change-in-prod"
    )
    COMMUNITY_CLOUD_FEED_URL: str = os.environ.get(
        "COMMUNITY_CLOUD_FEED_URL",
        "https://menagerie.circuitforge.tech/kiwi/api/v1/community/posts",
    )

    # Processing
    MAX_CONCURRENT_JOBS: int = int(os.environ.get("MAX_CONCURRENT_JOBS", "4"))
    USE_GPU: bool = os.environ.get("USE_GPU", "true").lower() in ("1", "true", "yes")
    GPU_MEMORY_LIMIT: int = int(os.environ.get("GPU_MEMORY_LIMIT", "6144"))

    # Quality
    MIN_QUALITY_SCORE: float = float(os.environ.get("MIN_QUALITY_SCORE", "50.0"))

    # CF-core resource coordinator (VRAM lease management)
    COORDINATOR_URL: str = os.environ.get("COORDINATOR_URL", "http://localhost:7700")

    # Hosted cf-orch coordinator — bearer token for managed cloud GPU inference (Paid+)
    # CFOrchClient reads CF_LICENSE_KEY automatically; exposed here for startup validation.
    CF_LICENSE_KEY: str | None = os.environ.get("CF_LICENSE_KEY")

    # E2E test account — analytics logging is suppressed for this user_id so test
    # runs don't pollute session counts.  Set to the Directus UUID of the test user.
    E2E_TEST_USER_ID: str | None = os.environ.get("E2E_TEST_USER_ID") or None

    # Feature flags
    ENABLE_OCR: bool = os.environ.get("ENABLE_OCR", "false").lower() in ("1", "true", "yes")
    # Use OrchestratedScheduler (coordinator-aware, multi-GPU fan-out) instead of
    # LocalScheduler. Defaults to true in CLOUD_MODE; can be set independently
    # for multi-GPU local rigs that don't need full cloud auth.
    USE_ORCH_SCHEDULER: bool | None = (
        None if os.environ.get("USE_ORCH_SCHEDULER") is None
        else os.environ.get("USE_ORCH_SCHEDULER", "").lower() in ("1", "true", "yes")
    )

    # Runtime
    DEBUG: bool = os.environ.get("DEBUG", "false").lower() in ("1", "true", "yes")
    CLOUD_MODE: bool = os.environ.get("CLOUD_MODE", "false").lower() in ("1", "true", "yes")
    DEMO_MODE: bool = os.environ.get("DEMO_MODE", "false").lower() in ("1", "true", "yes")

    def ensure_dirs(self) -> None:
        for d in (self.UPLOAD_DIR, self.PROCESSING_DIR, self.ARCHIVE_DIR):
            d.mkdir(parents=True, exist_ok=True)


settings = Settings()
