import sys
from pathlib import Path

import pytest

sys.path.insert(0, str(Path(__file__).resolve().parent.parent))

import config  # noqa: E402
import database  # noqa: E402
import fake_agents  # noqa: E402


@pytest.fixture
async def testdb(tmp_path, monkeypatch):
    """Frische SQLite-Datei je Test; setzt die modul-globale Connection zurück."""
    monkeypatch.setattr(config, "DB_PATH", tmp_path / "test.db")
    database._db = None
    await database.init_db()
    yield database
    await database.close_db()


@pytest.fixture
async def gescanntes_repo(tmp_path, monkeypatch, testdb):
    """mini_repo als echtes git-Repo mit echtem .planer/ (Fake-Scan, echter HEAD-Hash) —
    Grundlage für Viewer-/Drift-/Routen-Tests."""
    import shutil
    import subprocess

    import fake_agents
    import kanban
    import repo as repo_mod
    import scan_board

    wurzel = tmp_path / "mini"
    shutil.copytree(Path(__file__).parent / "fixtures" / "mini_repo", wurzel)
    env = {"PATH": "/usr/bin:/bin", "GIT_AUTHOR_NAME": "t", "GIT_AUTHOR_EMAIL": "t@t",
           "GIT_COMMITTER_NAME": "t", "GIT_COMMITTER_EMAIL": "t@t", "HOME": str(wurzel)}

    def git(*args):
        subprocess.run(["git", "-C", str(wurzel), *args], check=True, capture_output=True, env=env)

    git("init", "-b", "main")
    git("add", "-A")
    git("commit", "-m", "start")
    welt = fake_agents.Welt()
    fake_agents.set_welt(welt)
    fake_agents.standard_antworten(welt)
    monkeypatch.setenv("PLANER_FAKE_AGENTS", "1")
    monkeypatch.setattr(kanban, "RETRY_BACKOFF", 0.05)
    ergebnis = await scan_board.run_scan(wurzel, "mini", stand=repo_mod.head_hash(wurzel))
    assert ergebnis["status"] == "ok", ergebnis
    git("add", "-A")
    git("commit", "-m", "artefakte")
    yield wurzel, git
    fake_agents.set_welt(None)


@pytest.fixture
def fake_welt(monkeypatch):
    """Frische Fake-Welt + PLANER_FAKE_AGENTS aktiv; Tests hängen Antworten/Störungen an."""
    welt = fake_agents.Welt()
    fake_agents.set_welt(welt)
    monkeypatch.setenv("PLANER_FAKE_AGENTS", "1")
    yield welt
    fake_agents.set_welt(None)
