"""Fabryka silników (LOG-24) — jedyne miejsce znające konkretne implementacje. EPHEMERIS_ENGINE = own (domyślnie, permisywny Skyfield) | swisseph (zdalny AGPL). `available_engines()` zwraca to, co da się dziś uruchomić — używane przez harness porównawczy i testy parzystości. """ from __future__ import annotations import os from app.engine.base import EphemerisEngine def build_engine(name: str | None = None) -> EphemerisEngine: name = (name or os.getenv("EPHEMERIS_ENGINE", "own")).lower() if name in ("swisseph", "remote", "b"): from app.engine.remote_engine import RemoteEngine return RemoteEngine() from app.engine.skyfield_engine import SkyfieldEngine return SkyfieldEngine() def available_engines() -> dict[str, EphemerisEngine]: """Silniki gotowe do użycia teraz (own zawsze; swisseph jeśli skonfigurowany).""" engines: dict[str, EphemerisEngine] = {"own": build_engine("own")} if os.getenv("ENGINE_SWISSEPH_URL"): engines["swisseph"] = build_engine("swisseph") return engines