"""فحص ذاتي لمصنّف القواعد `_rule_mode` — يضمن أن كل قاعدة في الكتالوج
تُصنَّف للنمط الصحيح (presence/threshold/count) أو تُترك بوعي (None).
تشغيل: python test_rule_mode.py
"""
import os
import sys
import types

# stub لوحدة fingerprint + متغيّرات البيئة كي يُستورد agent بلا عتاد حقيقي
os.environ.setdefault("VEEDON_CLOUD_URL", "http://x")
os.environ.setdefault("VEEDON_DEVICE_TOKEN", "t")
fake = types.ModuleType("fingerprint")
fake.collect = lambda: {"fingerprint": "test"}
sys.modules["fingerprint"] = fake
sys.path.insert(0, os.path.dirname(__file__))
sys.path.insert(0, os.path.dirname(os.path.dirname(__file__)))   # edge/ لأجل vde

from agent import _rule_mode, _UNWIRED_RULES  # noqa: E402

# (key, config, expected_mode) — الإعدادات كما في FEATURE_CATALOG لكن بإحداثيات مملوءة
CASES = [
    # وجود مكاني → مخالفة فورية
    ("restricted_zone", {"coordinates": "0.1,0.1,0.9,0.9", "cooldown_s": 300}, "presence"),
    ("machine_zone_intrusion", {"coordinates": "0,0,1,1", "cooldown_s": 120}, "presence"),
    ("after_hours_intrusion", {"coordinates": "0,0,1,1", "cooldown_s": 300}, "presence"),
    ("elopement", {"coordinates": "0,0,1,1", "cooldown_s": 60}, "presence"),
    ("perimeter_intrusion", {"coordinates": "0,0,1,1", "cooldown_s": 120}, "presence"),
    ("wrong_direction", {"coordinates": "0,0,1,1", "cooldown_s": 60}, "presence"),
    ("suspended_load", {"coordinates": "0,0,1,1", "cooldown_s": 60}, "presence"),
    ("child_elopement", {"coordinates": "0,0,1,1", "cooldown_s": 30}, "presence"),
    ("pitch_invasion", {"coordinates": "0,0,1,1", "cooldown_s": 30}, "presence"),
    # كثافة ≥ حدّ → مخالفة
    ("crowding", {"threshold": 6, "cooldown_s": 600}, "threshold"),
    ("crowd_density", {"coordinates": "0,0,1,1", "threshold": 30, "cooldown_s": 30}, "threshold"),
    ("play_area_capacity", {"coordinates": "0,0,1,1", "threshold": 15, "cooldown_s": 120}, "threshold"),
    ("stand_occupancy", {"coordinates": "0,0,1,1", "threshold": 40, "cooldown_s": 30}, "threshold"),
    # عدّ دوري → معلومة
    ("queue_count", {"coordinates": "0,0,1,1", "interval_min": 10}, "count"),
    ("entry_exit_count", {"coordinates": "0,0,1,1", "interval_min": 15}, "count"),
    ("gate_attendance", {"coordinates": "0,0,1,1", "interval_min": 15}, "count"),
    ("crowd_flow", {"coordinates": "0,0,1,1", "interval_min": 2}, "count"),
    ("prayer_occupancy", {"coordinates": "0,0,1,1", "interval_min": 5}, "count"),
    ("loading_dock", {"coordinates": "0,0,1,1", "interval_min": 10}, "count"),
    ("patient_wait_time", {"coordinates": "0,0,1,1", "interval_min": 10}, "count"),
    ("bed_occupancy", {"coordinates": "0,0,1,1", "interval_min": 15}, "count"),
    # خاصّة/مؤجّلة → لا نمط عدّ
    ("camera_health", {}, None),
    ("emergency_lockdown", {"trigger_on": ["weapon_detection"], "cooldown_s": 0}, None),
    ("machine_idle", {"coordinates": "", "interval_min": 10}, None),        # مؤجّلة (كشف سكون)
    ("self_checkout_fraud", {"pos_integration": True, "cooldown_s": 60}, None),  # يحتاج POS
]


def run():
    for key, cfg, expected in CASES:
        got = _rule_mode(cfg, key)
        assert got == expected, f"{key}: توقّعنا {expected} فحصل {got}"
    # القواعد المؤجّلة تبقى خاملة مهما امتلأ إعدادها
    assert _rule_mode({"coordinates": "0,0,1,1", "interval_min": 10}, "machine_idle") is None
    # قاعدة وجود بلا إحداثيات (لم تُرسم منطقتها بعد) لا تُطلق شيئاً
    assert _rule_mode({"coordinates": "", "cooldown_s": 60}, "elopement") is None
    assert set(_UNWIRED_RULES) == {"machine_idle", "self_checkout_fraud"}
    print(f"OK — {len(CASES)} قاعدة مصنّفة صحيحاً")


if __name__ == "__main__":
    run()
