# Receber o webhook com Flask
# Explicação: https://xflowpayments.com/blog/api-pix-python/

# webhook.py
import hashlib
import hmac
import json
import os

from flask import Flask, abort, request

app = Flask(__name__)
SEGREDO = os.environ["XFLOW_WEBHOOK_SECRET"].encode()


def assinatura_valida(raw, header):
    esperado = "sha256=" + hmac.new(SEGREDO, raw, hashlib.sha256).hexdigest()
    return hmac.compare_digest(esperado.encode(), (header or "").encode())


@app.post("/webhooks/xflow")
def webhook():
    raw = request.get_data()  # corpo cru, antes de qualquer parse
    if not assinatura_valida(raw, request.headers.get("x-webhook-signature")):
        abort(401)

    evento = json.loads(raw)
    data = evento["data"]
    try:
        if evento["event"] == "transaction.paid" and data["livemode"]:
            dar_baixa_no_pedido(data["external_reference"], data["pix"]["endToEnd"])  # sua função
    except Exception:
        return "", 500  # sem 2xx, a entrega é reenviada
    return "", 200
