"""The expression language's server implementation (app/core/expr.py)
against the same cases the browser implementation runs
(frontend/src/lib/expr.cases.json + expr.test.ts) — so a condition or
formula decides identically on both sides."""

import json
from pathlib import Path

import pytest

from app.core.expr import evaluate, expression_error, expression_references

CASES = json.loads((Path(__file__).resolve().parents[2] / "frontend" / "src" / "lib" / "expr.cases.json").read_text(encoding="utf-8"))
CTX = CASES["context"]


def _close(actual, expected) -> bool:
    if isinstance(actual, (int, float)) and not isinstance(actual, bool) and isinstance(expected, (int, float)) and not isinstance(expected, bool):
        return abs(actual - expected) < 1e-9
    return json.dumps(actual) == json.dumps(expected)


@pytest.mark.parametrize("case", CASES["cases"], ids=[c["expr"] for c in CASES["cases"]])
def test_shared_case(case):
    actual = evaluate(case["expr"], CTX)
    assert _close(actual, case["value"]), f"{case['expr']} gave {actual!r}"


@pytest.mark.parametrize("expr", CASES["errors"])
def test_rejects(expr):
    assert expression_error(expr) is not None
    assert evaluate(expr, CTX) is None


@pytest.mark.parametrize("case", CASES["references"], ids=[c["expr"] for c in CASES["references"]])
def test_references(case):
    assert expression_references(case["expr"]) == case["names"]


def test_no_python_reachable():
    # Nothing but the expression's own AST runs: these are just names/paths.
    assert evaluate("__import__", {}) is None
    assert evaluate("x.__class__", {"x": 1}) is None
    assert expression_error("__import__('os')") is not None
