<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);

header('Content-Type: application/json');

require_once __DIR__ . '/../config/database.php';
require_once __DIR__ . '/../config/helpers.php';

$db = getDB();

// ✅ Lire données envoyées par Paxity
$input = file_get_contents('php://input');
$data  = json_decode($input, true);

// ✅ Log obligatoire (debug)
file_put_contents(
    __DIR__ . "/paxity_callback_log.txt",
    date('Y-m-d H:i:s') . " => " . $input . PHP_EOL,
    FILE_APPEND
);

// ✅ Sécurité minimale
if (!$data) {
    echo json_encode(['error' => 'Aucune donnée reçue']);
    exit;
}

// ✅ Adapter selon vraie réponse Paxity
$reference = $data['reference'] ?? null;
$status    = $data['status'] ?? null;

// ✅ Vérif
if (!$reference) {
    echo json_encode(['error' => 'Reference manquante']);
    exit;
}

// ✅ Chercher paiement
$stmt = $db->prepare("
    SELECT * FROM paiements 
    WHERE reference = ?
    LIMIT 1
");
$stmt->execute([$reference]);
$paiement = $stmt->fetch(PDO::FETCH_ASSOC);

if (!$paiement) {
    echo json_encode(['error' => 'Paiement introuvable']);
    exit;
}

// ✅ Evite double traitement
if ($paiement['statut'] === 'paye') {
    echo json_encode(['message' => 'Déjà traité']);
    exit;
}

// ✅ SI PAIEMENT OK
if ($status === 'success' || $status === 'SUCCESS') {

    // ✅ Mettre paiement à payé
    $db->prepare("
        UPDATE paiements 
        SET statut = 'paye' 
        WHERE id = ?
    ")->execute([$paiement['id']]);

    // ✅ Mettre RDV à payé
    $db->prepare("
        UPDATE rendez_vous 
        SET statut = 'paye' 
        WHERE id = ?
    ")->execute([$paiement['rdv_id']]);

    // ✅ Générer ticket QR
    $codeQr = genererCodeQR();

    // ✅ récupérer heure
    $stmt = $db->prepare("
        SELECT heure_rdv 
        FROM rendez_vous 
        WHERE id = ?
    ");
    $stmt->execute([$paiement['rdv_id']]);
    $rdv = $stmt->fetch(PDO::FETCH_ASSOC);

    $heureDebut = $rdv['heure_rdv'] ?? '00:00:00';
    $heureFin   = date('H:i:s', strtotime($heureDebut) + 15 * 60);

    // ✅ Insert ticket
    $db->prepare("
        INSERT INTO tickets (
            rdv_id,
            code_qr,
            prioritaire,
            statut,
            heure_validite_debut,
            heure_validite_fin
        )
        VALUES (?, ?, 0, 'actif', ?, ?)
    ")->execute([
        $paiement['rdv_id'],
        $codeQr,
        $heureDebut,
        $heureFin
    ]);

    echo json_encode([
        'success' => true,
        'message' => 'Paiement confirmé + ticket généré'
    ]);

    exit;
}

// ✅ SI ÉCHEC
if ($status === 'failed' || $status === 'FAILED') {

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

    echo json_encode([
        'error' => 'Paiement échoué'
    ]);

    exit;
}

// ✅ CAS INCONNU
echo json_encode([
    'message' => 'Callback reçu mais statut inconnu',
    'data' => $data
]);