"""Fidelity 0 des Trainers: Fake-E2E-Lauf im Subprozess — Sekunden, null Tokens.

Misst mit den CREATOR_PARAMS des Kandidaten: (a) halten die Invarianten? (b) wie viele
Agenten-Calls erzeugt die Struktur (Proxy für Tokens/Laufzeit)? Unsinnige Kandidaten
fallen hier raus, bevor ein echter Lauf Geld kostet.

CLI: python3 train_f0.py <ausgabe.json>   (CREATOR_PARAMS im ENV)
"""

import asyncio
import json
import sys
import tempfile
import time
from pathlib import Path

# WICHTIG: config (mit CREATOR_PARAMS) lädt vor allen Pipeline-Modulen
import database
from config import DEFAULT_PROVIDER
from fake_agents import Welt, aktivieren
from fsutil import atomic_write_json


async def f0(out: str) -> None:
    tmp = Path(tempfile.mkdtemp(prefix="train-f0-"))
    database.DB_PATH = tmp / "f0.db"
    database._db = None
    await database.init_db()
    welt = Welt()
    aktivieren(welt)
    import board_inventory as bi
    import qa
    qa.QA_DIR = tmp / "qa"
    from pipeline import GenContext

    work = tmp / "arbeit"
    work.mkdir()
    files = {"arbeit": work, "final": tmp / "blocks.md",
             "sub_roh": tmp / "sub_roh.json", "sidecar": tmp / "subblocks.json",
             "facts": tmp / "facts.json", "question_pattern": tmp / "question_pattern.json",
             "artefakte": tmp / "artefakte.json", "outline": tmp / "outline.json",
             "outline_slots": [tmp / f"outline-{i}.json" for i in (1, 2, 3)],
             "research": [work / f"research-{i}.md" for i in (1, 2, 3, 4, 5)]}
    ctx = GenContext(topic="f0", provider=DEFAULT_PROVIDER, is_cancelled=lambda: False)
    start = time.monotonic()
    ok = await asyncio.wait_for(
        bi.run_boards(ctx, lambda *a, **k: None, files, {"type": "thema"}, None, "",
                      research=True, qa_force=True), timeout=180)
    from invarianten import pruefe_invarianten
    fehler = await pruefe_invarianten("f0", files)
    atomic_write_json(Path(out), {
        "ok": bool(ok), "invarianten_fehler": fehler, "calls": len(welt.calls),
        "dauer_s": round(time.monotonic() - start, 1)}, indent=1)
    await database.close_db()


if __name__ == "__main__":
    if len(sys.argv) != 2:
        raise SystemExit("Nutzung: python3 train_f0.py <ausgabe.json>")
    asyncio.run(f0(sys.argv[1]))
