"""self-check لمحوّل Open Wearables: تحويل series_type → عتبة، بلا قاعدة بيانات.

يشغّل: python -m pytest test_ow_adapter.py   أو   python test_ow_adapter.py
يغطّي الجزء الجديد غير التافه: خريطة السلاسل + تجاهل المجاميع اليومية + اختيار
أول عينة تتجاوز العتبة (نفس المنطق داخل open_wearables_webhook).
"""
import base64
import hashlib
import hmac
import time

from app.health import SERIES_MAP, evaluate, verify_svix


def peak_alert(webhook: dict):
    """يحاكي حلقة الويب-هوك: يعيد alert_type لأوّل عينة لحظية تتجاوز العتبة."""
    data = webhook["data"]
    metric = SERIES_MAP.get(str(data.get("series_type", "")).lower())
    if not metric:
        return None
    for s in data.get("samples", []):
        if s.get("is_daily_total"):
            continue
        v = evaluate(metric, float(s["value"]), False)
        if v:
            return v[0]
    return None


def test_hr_high():
    wh = {"type": "heart_rate.created", "data": {
        "user_id": "u1", "provider": "garmin", "series_type": "heart_rate",
        "samples": [{"value": 62, "is_daily_total": None},
                    {"value": 165, "is_daily_total": None}]}}
    assert peak_alert(wh) == "hr_high"


def test_spo2_low():
    wh = {"type": "oxygen_saturation.created", "data": {
        "user_id": "u1", "series_type": "oxygen_saturation",
        "samples": [{"value": 88, "is_daily_total": None}]}}
    assert peak_alert(wh) == "spo2_low"


def test_glucose_low():
    wh = {"type": "blood_glucose.created", "data": {
        "user_id": "u1", "series_type": "blood_glucose",
        "samples": [{"value": 55, "is_daily_total": None}]}}
    assert peak_alert(wh) == "glucose_low"


def test_daily_total_ignored():
    # مجموع يومي 160 نبضة يجب تجاهله (ليس قراءة لحظية)
    wh = {"type": "heart_rate.created", "data": {
        "user_id": "u1", "series_type": "heart_rate",
        "samples": [{"value": 160, "is_daily_total": True}]}}
    assert peak_alert(wh) is None


def test_normal_ok():
    wh = {"type": "heart_rate.created", "data": {
        "user_id": "u1", "series_type": "heart_rate",
        "samples": [{"value": 72, "is_daily_total": None}]}}
    assert peak_alert(wh) is None


def test_unmapped_series():
    wh = {"type": "steps.created", "data": {
        "user_id": "u1", "series_type": "steps",
        "samples": [{"value": 9000, "is_daily_total": None}]}}
    assert peak_alert(wh) is None


# ── تحقّق توقيع Svix (أمان webhook الحقيقي من Open Wearables) ──────────
_KEY = base64.b64encode(b"veedon-test-signing-key-0123456789").decode()
_SECRET = "whsec_" + _KEY


def _sign(msg_id, ts, body, key_b64=_KEY):
    signed = f"{msg_id}.{ts}.{body}".encode()
    mac = hmac.new(base64.b64decode(key_b64), signed, hashlib.sha256).digest()
    return "v1," + base64.b64encode(mac).decode()


def test_svix_valid():
    ts = str(int(time.time()))
    body = '{"type":"heart_rate.created"}'
    hdr = {"svix-id": "msg_1", "svix-timestamp": ts,
           "svix-signature": _sign("msg_1", ts, body)}
    assert verify_svix(_SECRET, hdr, body) is True


def test_svix_tampered_body():
    ts = str(int(time.time()))
    good = '{"value":72}'
    hdr = {"svix-id": "msg_1", "svix-timestamp": ts,
           "svix-signature": _sign("msg_1", ts, good)}
    assert verify_svix(_SECRET, hdr, '{"value":999}') is False  # جسم مختلف


def test_svix_expired_timestamp():
    ts = str(int(time.time()) - 600)  # قبل 10 دقائق > تحمّل 5 دقائق
    body = "{}"
    hdr = {"svix-id": "m", "svix-timestamp": ts,
           "svix-signature": _sign("m", ts, body)}
    assert verify_svix(_SECRET, hdr, body) is False


if __name__ == "__main__":
    test_hr_high(); test_spo2_low(); test_glucose_low()
    test_daily_total_ignored(); test_normal_ok(); test_unmapped_series()
    test_svix_valid(); test_svix_tampered_body(); test_svix_expired_timestamp()
    print("ok — all OW adapter checks passed")
