from __future__ import annotations

import json
from pathlib import Path
from typing import Any


ROOT = Path(__file__).resolve().parents[1]
DEFAULT_JSON = ROOT / "GatherTradingData.json"
DEFAULT_OUT = ROOT / "Temp" / "anti_whipsaw_gate_v1.json"


def _load_json(path: Path) -> dict[str, Any]:
    if not path.exists():
        return {}
    try:
        payload = json.loads(path.read_text(encoding="utf-8"))
    except Exception:
        return {}
    return payload if isinstance(payload, dict) else {}


def _parse_jsonish(value: Any) -> Any:
    if isinstance(value, (dict, list)):
        return value
    if isinstance(value, str) and value.strip():
        try:
            return json.loads(value)
        except Exception:
            return value
    return value


def main() -> int:
    gtd = _load_json(DEFAULT_JSON)
    h = ((gtd.get("data") or {}).get("_harness_context") or {})
    rows = _parse_jsonish(h.get("anti_whipsaw_gate_json"))
    if not isinstance(rows, list):
        rows = []
    rows = [r for r in rows if isinstance(r, dict)]
    gates = [str(r.get("anti_whipsaw_gate") or "").upper() for r in rows]
    if "WHIPSAW_AUTO_RELEASED" in gates:
        status = "WHIPSAW_AUTO_RELEASED"
    elif "WHIPSAW_WEAKENING" in gates:
        status = "WHIPSAW_WEAKENING"
    elif "WHIPSAW_CONFIRMED" in gates:
        status = "WHIPSAW_CONFIRMED"
    elif "CONFIRMED_SELL" in gates:
        status = "CONFIRMED_SELL"
    elif rows:
        status = gates[0] or "INCONCLUSIVE"
    else:
        status = "DATA_MISSING"

    payload = {
        "formula_id": "ANTI_WHIPSAW_GATE_V1",
        "gate": "PASS" if rows else "DATA_MISSING",
        "anti_whipsaw_status": status,
        "rows": len(rows),
        "source": "anti_whipsaw_gate_json",
    }
    DEFAULT_OUT.parent.mkdir(parents=True, exist_ok=True)
    DEFAULT_OUT.write_text(json.dumps(payload, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(payload, ensure_ascii=False, indent=2))
    return 0


if __name__ == "__main__":
    raise SystemExit(main())
