"""Evaluates a form's conditional-visibility rules against sample driver
values (FR-FRM-005/006/007: "live preview ... enter sample driver-field
values and see ... which conditional fields become visible")."""

from typing import Any


def _eval_operator(operator: str, actual: Any, expected: Any) -> bool:
    if actual is None:
        return False
    try:
        if operator == "equals":
            return actual == expected
        if operator == "not_equals":
            return actual != expected
        if operator == "gt":
            return actual > expected
        if operator == "gte":
            return actual >= expected
        if operator == "lt":
            return actual < expected
        if operator == "lte":
            return actual <= expected
        if operator == "in":
            return actual in (expected if isinstance(expected, list) else [expected])
    except TypeError:
        return False
    return False


def evaluate_visibility(field_definitions: list[dict], sample_values: dict[str, Any]) -> dict[str, bool]:
    """A field with no visibility_rules is always visible. A field with rules
    is visible only if every rule passes (AND semantics) — each rule names
    its own driver field, so different fields on the same form can each key
    off a different driver, per FR-FRM-006."""
    visible: dict[str, bool] = {}
    for field in field_definitions:
        rules = field.get("visibility_rules") or []
        if not rules:
            visible[field["name"]] = True
            continue
        visible[field["name"]] = all(
            _eval_operator(rule["operator"], sample_values.get(rule["driver_field"]), rule["value"])
            for rule in rules
        )
    return visible
