"""Перевірка підпису вихідного вебхука ApexSFA на стороні отримувача.

Заголовок: X-Webhook-Signature: t=<unix-секунди>,v1=<hex HMAC-SHA256>
Підписується рядок f"{t}.{сире тіло запиту}" секретом підписки (secret_key).
Перевіряйте САМЕ сирі байти тіла — не перекодований JSON.
"""

from __future__ import annotations

import hashlib
import hmac
import time

TOLERANCE_SECONDS = 300


def verify_signature(
    raw_body: bytes,
    signature_header: str,
    secret: str,
    *,
    tolerance: int = TOLERANCE_SECONDS,
) -> bool:
    try:
        parts = dict(item.split("=", 1) for item in signature_header.split(","))
        timestamp = int(parts["t"])
        received = parts["v1"]
    except (KeyError, ValueError):
        return False
    if tolerance and abs(time.time() - timestamp) > tolerance:
        return False
    signed = f"{timestamp}.".encode() + raw_body
    expected = hmac.new(secret.encode("utf-8"), signed, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, received)


# Приклад на Flask:
#
# from flask import Flask, request, abort
# app = Flask(__name__)
# SECRET = "whsec_XXXXXXXXXXXXXXXXXXXXXXXX"
# seen_event_ids: set[str] = set()  # у проді — таблиця у вашій БД
#
# @app.post("/apexsfa/webhook")
# def apexsfa_webhook():
#     raw = request.get_data()
#     if not verify_signature(raw, request.headers.get("X-Webhook-Signature", ""), SECRET):
#         abort(401)
#     event = request.get_json()
#     if event["event_id"] in seen_event_ids:
#         return "", 200          # повтор — уже оброблено
#     seen_event_ids.add(event["event_id"])
#     # ... обробка event["event_type"], event["payload"] ...
#     return "", 200


if __name__ == "__main__":
    secret = "whsec_XXXXXXXXXXXXXXXXXXXXXXXX"
    body = b'{"delivered_attempt":1,"entity_id":null,"entity_type":null,"event_id":"0192f3c1-6e7f-7091-8a2b-3c4d5e6f7a8b","event_type":"webhook.test","payload":{"ping_at":"2026-10-27T08:00:00+00:00","test_payload":{"test":true}},"tenant_id":"3f2a1b2c-3d4e-4f5a-8b6c-7d8e9f0a1b2c"}'
    ts = int(time.time())
    digest = hmac.new(
        secret.encode(), f"{ts}.".encode() + body, hashlib.sha256
    ).hexdigest()
    header = f"t={ts},v1={digest}"
    print(header, verify_signature(body, header, secret))
