<?php
// ============================================
// SEN RDV SANTÉ+ — Génération du ticket QR après paiement
// POST /api/tickets/generer.php
// Headers: Authorization: Bearer {token}
// Body: { "rdv_id": 1, "reference_transaction": "WAVE-ABC123" }
// ============================================

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

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    repondre(['erreur' => 'Méthode non autorisée'], 405);
}

$userConnecte = verifierToken();
$body = getBody();
validerChamps($body, ['rdv_id', 'reference_transaction']);

$db = getDB();

// je récupère le RDV avec toutes les infos nécessaires pour le ticket
$stmt = $db->prepare("
    SELECT r.*, s.nom AS service_nom, h.nom AS hopital_nom,
           u.nom AS patient_nom_compte, u.telephone
    FROM rendez_vous r
    JOIN services s ON s.id = r.service_id
    JOIN hopitaux h ON h.id = s.hopital_id
    JOIN utilisateurs u ON u.id = r.patient_id
    WHERE r.id = ? AND r.patient_id = ?
");
$stmt->execute([$body['rdv_id'], $userConnecte['utilisateur_id']]);
$rdv = $stmt->fetch();

if (!$rdv) {
    repondre(['erreur' => 'Rendez-vous introuvable'], 404);
}

if ($rdv['statut'] !== 'confirme') {
    repondre(['erreur' => 'Ce RDV doit être confirmé par le service avant le paiement'], 409);
}

// je vérifie que le paiement existe et n'est pas expiré
$stmt = $db->prepare("
    SELECT id FROM paiements
    WHERE rdv_id = ? AND statut = 'en_attente' AND expire_at > NOW()
");
$stmt->execute([$rdv['id']]);
$paiement = $stmt->fetch();

if (!$paiement) {
    repondre(['erreur' => 'Lien de paiement expiré, contactez le service'], 410);
}

// je marque le paiement comme validé avec la référence de transaction Mobile Money
$stmt = $db->prepare("
    UPDATE paiements
    SET statut = 'valide', reference_transaction = ?, paye_at = NOW()
    WHERE id = ?
");
$stmt->execute([$body['reference_transaction'], $paiement['id']]);

// je mets à jour le statut du RDV en "paye"
$stmt = $db->prepare("UPDATE rendez_vous SET statut = 'paye' WHERE id = ?");
$stmt->execute([$rdv['id']]);

// je génère le code QR unique — c'est la clé d'entrée du patient à l'hôpital
$codeQR = genererCodeQR();

// je calcule la fenêtre de priorité : 15 minutes autour de l'heure du RDV
// le ticket est prioritaire de heure_rdv à heure_rdv+15min
$heureDebut = $rdv['heure_rdv'];
$heureFin   = date('H:i:s', strtotime($rdv['heure_rdv']) + 15 * 60);

// je crée le ticket dans la base avec le statut prioritaire
$stmt = $db->prepare("
    INSERT INTO tickets
        (rdv_id, code_qr, statut, prioritaire, heure_validite_debut, heure_validite_fin)
    VALUES (?, ?, 'actif', 1, ?, ?)
");
$stmt->execute([$rdv['id'], $codeQR, $heureDebut, $heureFin]);

// je notifie le patient que son ticket est prêt
$message = "SEN RDV SANTÉ+ : Paiement reçu ! Votre ticket PRIORITAIRE est prêt. " .
           "Code : " . $codeQR . ". RDV le " . $rdv['date_rdv'] . " à " . $rdv['heure_rdv'] .
           " - " . $rdv['service_nom'] . " - " . $rdv['hopital_nom'];

$stmt = $db->prepare("
    INSERT INTO notifications (utilisateur_id, rdv_id, type, canal, message)
    VALUES (?, ?, 'paiement', 'sms', ?)
");
$stmt->execute([$userConnecte['utilisateur_id'], $rdv['id'], $message]);

// je retourne toutes les infos du ticket — l'app mobile affiche le QR code avec ces données
repondre([
    'succes'  => true,
    'message' => 'Ticket prioritaire généré avec succès',
    'ticket'  => [
        'code_qr'              => $codeQR,
        'prioritaire'          => true,
        'patient_nom'          => $rdv['patient_nom'],
        'patient_prenom'       => $rdv['patient_prenom'],
        'service'              => $rdv['service_nom'],
        'hopital'              => $rdv['hopital_nom'],
        'date_rdv'             => $rdv['date_rdv'],
        'heure_rdv'            => $rdv['heure_rdv'],
        'heure_validite_debut' => $heureDebut,
        'heure_validite_fin'   => $heureFin,
        'mention'              => 'PRIORITAIRE'
    ]
]);