"""KONTROLL-FIXTURE: ein Backtest muss die Referenz reproduzieren, BEVOR er berichtet.

⚠⚠ WARUM ES DAS GIBT (2026-08-13). Zwei an einem Tag gebaute Messungen konnten
den dokumentierten Squeeze-Referenzwert (+0,124/+0,292, `backtest_squeeze_
touchfill.py`) NICHT reproduzieren — sie kamen auf −0,151/−0,079 bei einem
Drittel der Trades. Beide Ergebnisse mussten deshalb auf den **relativen**
Vergleich beschränkt werden; die absolute Aussage war nicht führbar. Und es
blieb offen, ob der dokumentierte Wert oder die neue Pipeline danebenliegt.

`backtest_verworfene_v2.py` macht es vorbildlich von Hand („✅ Die Kontrolle
reproduziert … Pipeline in Ordnung"). Hier ist dasselbe als geteilte Funktion,
damit es niemand vergisst.

    from core.kontrolle import pruefe_squeeze
    ok = pruefe_squeeze(h1_oer, h2_oer, n_h1, n_h2)   # meldet und gibt bool

⚠ Es wird NICHT abgebrochen. Ein Backtest darf von der Referenz abweichen — er
muss es nur WISSEN und sagen. Ein harter Abbruch würde legitime Varianten
(andere Fill-Annahme, anderer Exit) unmöglich machen; eine stille Abweichung
dagegen erzeugt genau die Fehlschlüsse, die hier vermieden werden sollen.

⚠ Die Referenzen sind MESSWERTE, keine Wunschzahlen. Wer sie ändert, muss die
Quelle nennen — sonst wandert die Latte mit dem Ergebnis.
"""
from __future__ import annotations

from dataclasses import dataclass


@dataclass(frozen=True)
class Referenz:
    name: str
    quelle: str
    h1: float
    h2: float
    n_h1: int
    n_h2: int
    toleranz: float = 0.06      # ØR-Abstand, ab dem gewarnt wird


# ── Die dokumentierten Referenzwerte des Projekts ────────────────────────────
SQUEEZE_TOUCHFILL = Referenz(
    name="Squeeze · ruhende Order am Level, Fill bei Beruehrung",
    quelle="backtest_squeeze_touchfill.py (2026-08-06)",
    h1=+0.124, h2=+0.292, n_h1=1092, n_h2=1807)

SQUEEZE_CLOSEBRUCH = Referenz(
    name="Squeeze · Fill bei Close-Bruch (die OPTIMISTISCHE Annahme)",
    quelle="backtest_squeeze_entry.py (2026-08-05)",
    h1=+0.456, h2=+0.611, n_h1=801, n_h2=1280)

SQUEEZE_MARKT = Referenz(
    name="Squeeze · Markt-Einstieg am Bar-Close",
    quelle="backtest_squeeze_entry.py (2026-08-05)",
    h1=-0.158, h2=-0.006, n_h1=801, n_h2=1280)


def pruefe(ref: Referenz, h1: float, h2: float,
           n_h1: int | None = None, n_h2: int | None = None,
           still: bool = False) -> bool:
    """Reproduziert der Lauf die Referenz? Meldet den Befund, gibt bool zurueck."""
    d1, d2 = abs(h1 - ref.h1), abs(h2 - ref.h2)
    ok = d1 <= ref.toleranz and d2 <= ref.toleranz
    if still:
        return ok
    print(f"\n  ── KONTROLLE: {ref.name}")
    print(f"     Referenz {ref.quelle}")
    print(f"     erwartet  H1 {ref.h1:+.3f} · H2 {ref.h2:+.3f}"
          f"   (n {ref.n_h1}/{ref.n_h2})")
    n_txt = "" if n_h1 is None else f"   (n {n_h1}/{n_h2})"
    print(f"     gemessen  H1 {h1:+.3f} · H2 {h2:+.3f}{n_txt}")
    print(f"     Abstand   H1 {d1:.3f} · H2 {d2:.3f}   (Toleranz {ref.toleranz})")
    if ok:
        print("     ✅ reproduziert — die Pipeline ist in Ordnung, ABSOLUTWERTE "
              "sind belastbar.")
    else:
        print("     ❌ WEICHT AB. Dann gilt:")
        print("        · der RELATIVE Vergleich innerhalb dieses Laufs bleibt gueltig,")
        print("          solange alle Varianten dieselbe Entry-Liste benutzen;")
        print("        · die ABSOLUTWERTE sind es NICHT — sie duerfen nicht als")
        print("          Ertragsaussage berichtet werden.")
        if n_h1 is not None and (n_h1 < ref.n_h1 * 0.6 or n_h1 > ref.n_h1 * 1.6):
            print(f"        · ⚠ auch die Trade-ZAHL weicht stark ab ({n_h1} gegen "
                  f"{ref.n_h1}) — meist ein anderer Filter (ATR-Floor, Cooldown,")
            print("          Slot-Behandlung), nicht der Markt.")
    return ok


def pruefe_squeeze(h1: float, h2: float, n_h1=None, n_h2=None,
                   variante: str = "touchfill") -> bool:
    """Bequemer Aufruf fuer die haeufigste Kontrolle."""
    ref = {"touchfill": SQUEEZE_TOUCHFILL,
           "closebruch": SQUEEZE_CLOSEBRUCH,
           "markt": SQUEEZE_MARKT}[variante]
    return pruefe(ref, h1, h2, n_h1, n_h2)
