"""AGB routed-Pipeline: Gate, Reference-/Embedding-Rescue, LLM-skip, Re-Tiering.
Embedding + LLM offline-gestubbt → deterministisch, kein Netzwerk (Reference = echtes Regex)."""
import asyncio
from types import SimpleNamespace

import pytest

import compliance.services.specialist_agents.agb._pipeline as pipeline
from compliance.services.checkers.base import CheckResult
from compliance.services.specialist_agents._base import AgentInput
from compliance.services.specialist_agents.agb.agent import AGBAgent


class _Stub:
    def __init__(self, present):
        self._p = present

    async def check(self, ctrl, doc):
        return CheckResult(present=self._p)


@pytest.fixture(autouse=True)
def _offline(monkeypatch):
    monkeypatch.setattr(pipeline, "_EMB", _Stub(None))
    monkeypatch.setattr(pipeline, "_LLM", _Stub(None))


def _routed(field_ids, text, context=None):
    findings = [SimpleNamespace(field_id=fid) for fid in field_ids]
    return asyncio.run(pipeline.run_routed(findings, text, context or {}))


def test_gate_termination_na_for_oneoff_shop():
    text = "Widerrufsbelehrung: Sie koennen binnen 14 Tagen widerrufen. " * 5
    kept, resolved, gated = _routed(["termination", "termination_form"], text)
    assert set(gated) == {"termination", "termination_form"}
    assert kept == []


def test_reference_rescues_data_protection():
    text = "Einzelheiten zur Verarbeitung in unserer Datenschutzerklaerung. " * 5
    kept, resolved, gated = _routed(["data_protection"], text)
    assert "data_protection" in resolved and kept == []


def test_embedding_rescue_resolves(monkeypatch):
    monkeypatch.setattr(pipeline, "_EMB", _Stub(True))
    kept, resolved, gated = _routed(["scope"], "x" * 200)
    assert "scope" in resolved


def test_llm_skipped_keeps_finding():
    kept, resolved, gated = _routed(["delivery_timeframe"], "x" * 200, {"skip_llm": True})
    assert [f.field_id for f in kept] == ["delivery_timeframe"] and resolved == []


def test_evaluate_retiers_low_out_of_findings():
    text = ("Allgemeine Geschaeftsbedingungen. Vertragsschluss durch Bestellung. "
            "Haftung beschraenkt. Gerichtsstand Muenchen. ") * 6
    out = asyncio.run(AGBAgent().evaluate(AgentInput(doc_type="agb", text=text)))
    assert out.agent == "agb" and out.agent_version == "2.0"
    assert all(f.severity in ("HIGH", "MEDIUM") for f in out.findings)
