<?php
/**
 * ============================================
 * SEN RDV SANTÉ+ — Callback PayDunya (sécurisé)
 * Endpoint : POST /api/paiements/callback.php
 *
 * Rôle :
 * Je reçois la notification serveur PayDunya
 * Je valide ou échoue définitivement un paiement.
 *
 * ⚠️ Le mobile n’intervient JAMAIS ici.
 * ============================================
 */

error_log('CALLBACK PAYDUNYA APPELÉ');
require_once '../config/database.php';
require_once '../config/helpers.php';
require_once '../config/push.php';
require_once '../config/paydunya.php';

// Je récupère le body brut pour vérification et logs
$rawInput = file_get_contents('php://input');
$body = json_decode($rawInput, true);

// Je refuse immédiatement un payload invalide
if (!$body || !is_array($body)) {
    http_response_code(400);
    exit;
}

// Je récupère une éventuelle signature PayDunya
$possibleHeaders = [
    'HTTP_X_PAYDUNYA_SIGNATURE',
    'HTTP_PAYDUNYA_SIGNATURE',
    'HTTP_X_SIGNATURE'
];

$signatureRecue = null;
foreach ($possibleHeaders as $header) {
    if (!empty($_SERVER[$header])) {
        $signatureRecue = $_SERVER[$header];
        break;
    }
}

// Je calcule la signature attendue (HMAC)
$signatureAttendue = hash_hmac('sha256', $rawInput, PAYDUNYA_PRIVATE_KEY);

// Mode tolérant : je log si la signature est absente ou invalide
if ($signatureRecue) {
    if (!hash_equals($signatureAttendue, $signatureRecue)) {
        error_log('[PayDunya Callback] Signature invalide détectée');
        // ⚠️ Je ne bloque PAS encore (sandbox)
    }
} else {
    error_log('[PayDunya Callback] Aucun header de signature détecté');
}

$db = getDB();

/**
 * Extraction des données critiques
 */
$reference = $body['reference']
          ?? $body['custom_data']['reference']
          ?? null;

$statutPaydunya = $body['status']
               ?? $body['payment_status']
               ?? null;

$rdvId = $body['custom_data']['rdv_id'] ?? null;
$paiementId = $body['custom_data']['paiement_id'] ?? null;

if (!$reference || !$rdvId || !$paiementId || !$statutPaydunya) {
    http_response_code(400);
    exit;
}

/**
 * Je récupère le paiement concerné
 */
$stmt = $db->prepare("
    SELECT id, statut
    FROM paiements
    WHERE id = ? AND rdv_id = ? AND reference_transaction = ?
");
$stmt->execute([$paiementId, $rdvId, $reference]);
$paiement = $stmt->fetch();

if (!$paiement) {
    http_response_code(404);
    exit;
}

// ✅ IDEMPOTENCE
if (in_array($paiement['statut'], ['valide', 'echoue'])) {
    http_response_code(200);
    echo json_encode(['received' => true, 'already_processed' => true]);
    exit;
}

/**
 * ✅ PAIEMENT RÉUSSI
 */
if (in_array($statutPaydunya, ['success', 'successful', 'completed', 'paid'])) {

    $db->prepare("
        UPDATE paiements SET statut = 'valide', paye_at = NOW()
        WHERE id = ?
    ")->execute([$paiementId]);

    $db->prepare("
        UPDATE rendez_vous SET statut = 'paye'
        WHERE id = ?
    ")->execute([$rdvId]);

    // Je vérifie qu’aucun ticket n’existe déjà
    $stmt = $db->prepare("SELECT id FROM tickets WHERE rdv_id = ?");
    $stmt->execute([$rdvId]);

    if (!$stmt->fetch()) {

        $stmt = $db->prepare("
            SELECT heure_rdv, patient_id
            FROM rendez_vous WHERE id = ?
        ");
        $stmt->execute([$rdvId]);
        $rdv = $stmt->fetch();

        $codeQR = 'SENRDV-' . strtoupper(bin2hex(random_bytes(8)));
        $heureDebut = $rdv['heure_rdv'];
        $heureFin = date('H:i:s', strtotime($heureDebut) + 900);

        $db->prepare("
            INSERT INTO tickets (
                rdv_id, code_qr, statut, prioritaire,
                heure_validite_debut, heure_validite_fin
            )
            VALUES (?, ?, 'actif', 1, ?, ?)
        ")->execute([$rdvId, $codeQR, $heureDebut, $heureFin]);

        envoyerNotificationPush(
            $rdv['patient_id'],
            '🎫 Ticket prêt',
            'Paiement confirmé. Votre ticket est disponible.',
            ['type' => 'ticket_pret', 'rdv_id' => $rdvId]
        );
    }

    http_response_code(200);
    echo json_encode(['received' => true, 'status' => 'success']);
    exit;
}

/**
 * ❌ PAIEMENT ÉCHOUÉ
 */
if (in_array($statutPaydunya, ['failed', 'cancelled', 'expired'])) {

    $db->prepare("
        UPDATE paiements SET statut = 'echoue'
        WHERE id = ?
    ")->execute([$paiementId]);

    http_response_code(200);
    echo json_encode(['received' => true, 'status' => 'failed']);
    exit;
}

// Par sécurité : toujours répondre 200
http_response_code(200);
echo json_encode(['received' => true]);