"""Проверка 3-уровневой цепочки: primary(mistral) → tier1(glm) → tier2(NVIDIA).
Каждый уровень проверяем изолированно + каскадный слом."""
import asyncio
import os
import sys
import time

os.chdir(os.path.expanduser("~/Services/VakHunter"))
sys.path.insert(0, ".")
for ln in open(".env", encoding="utf-8"):
    ln = ln.strip()
    if "=" in ln and not ln.startswith("#"):
        k, v = ln.split("=", 1)
        os.environ.setdefault(k.strip(), v.strip().strip('"').strip("'"))
from bot.ai_assistant import AIAssistant

PASS, FAIL = [], []


def ck(n, ok, d=""):
    (PASS if ok else FAIL).append(n)
    print(("✅" if ok else "❌"), n, ("— " + str(d)[:120]) if d else "")


async def main():
    ai = AIAssistant()
    msgs = [{"role": "user", "content": "Ответь одним словом: столица Франции?"}]
    print("primary:", ai.base_url, ai.model)
    print("tier1 FALLBACK:", os.getenv("FALLBACK_API_BASE"), os.getenv("FALLBACK_MODEL"))
    print("tier2 FALLBACK2:", os.getenv("FALLBACK2_API_BASE"), os.getenv("FALLBACK2_MODEL"))

    # tier1 напрямую (glm)
    t = time.time()
    r = await ai._try_fallback_tier("FALLBACK", msgs, 0.2, 32, 40.0)
    ck("tier1 glm-4.5-flash отвечает", bool(r and r.strip()), f"{time.time()-t:.1f}s → {r!r}")
    # tier2 напрямую (NVIDIA)
    t = time.time()
    r = await ai._try_fallback_tier("FALLBACK2", msgs, 0.2, 32, 40.0)
    ck("tier2 NVIDIA отвечает", bool(r and r.strip()), f"{time.time()-t:.1f}s → {r!r}")

    # каскад: primary мёртв → должен уйти в tier1 (glm)
    ai2 = AIAssistant()
    ai2.base_url = "http://127.0.0.1:59999"
    t = time.time()
    r = await ai2._call_api(msgs, 0.2, 32, timeout=45.0)
    ck("primary мёртв → tier1 glm подхватывает", bool(r and r.strip()), f"{time.time()-t:.1f}s → {r!r}")

    # каскад: primary И tier1 мёртвы → должен уйти в tier2 (NVIDIA)
    ai3 = AIAssistant()
    ai3.base_url = "http://127.0.0.1:59999"
    os.environ["FALLBACK_API_BASE"] = "http://127.0.0.1:59998"  # ломаем tier1
    t = time.time()
    r = await ai3._call_api(msgs, 0.2, 32, timeout=45.0)
    ck("primary+tier1 мертвы → tier2 NVIDIA подхватывает", bool(r and r.strip()), f"{time.time()-t:.1f}s → {r!r}")

    print("\n" + "=" * 56)
    print(f"ЦЕПОЧКА: {len(PASS)} PASS / {len(FAIL)} FAIL")
    for f in FAIL:
        print("  ❌", f)

asyncio.run(main())
