<?php
// ============================================
// SEN RDV SANTÉ+ — Scan du QR Code à l'entrée
// POST /api/tickets/scanner.php
// Headers: Authorization: Bearer {token}
// Body: { "code_qr": "SENRDV-ABCD1234EFGH5678" }
// ============================================

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

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

// seul un gérant ou admin peut scanner — pas un patient
$userConnecte = verifierToken();

if (!in_array($userConnecte['role'], ['gerant', 'admin_hopital'])) {
    repondre(['erreur' => 'Accès réservé aux agents de l\'hôpital'], 403);
}

$body = getBody();
validerChamps($body, ['code_qr']);

$db = getDB();

// je récupère le ticket avec toutes les infos du RDV associé
$stmt = $db->prepare("
    SELECT t.*, r.patient_nom, r.patient_prenom, r.date_rdv, r.heure_rdv,
           r.motif, r.statut AS rdv_statut, r.patient_id,
           r.service_id, r.numero_file,
           s.nom AS service_nom, h.nom AS hopital_nom
    FROM tickets t
    JOIN rendez_vous r ON r.id = t.rdv_id
    JOIN services s ON s.id = r.service_id
    JOIN hopitaux h ON h.id = s.hopital_id
    WHERE t.code_qr = ?
");
$stmt->execute([$body['code_qr']]);
$ticket = $stmt->fetch();

if (!$ticket) {
    repondre(['erreur' => 'QR Code invalide ou inexistant'], 404);
}

// je vérifie que ce ticket n'a pas déjà été utilisé
if ($ticket['statut'] === 'consomme') {
    repondre([
        'erreur'    => 'Ce ticket a déjà été scanné',
        'scanne_at' => $ticket['scanne_at']
    ], 409);
}

if ($ticket['statut'] === 'expire') {
    repondre(['erreur' => 'Ce ticket est expiré'], 410);
}

// je vérifie la fenêtre de priorité
$maintenant     = date('H:i:s');
$estPrioritaire = $ticket['prioritaire'] &&
                  $maintenant >= $ticket['heure_validite_debut'] &&
                  $maintenant <= $ticket['heure_validite_fin'];

$prioriteFinale = $estPrioritaire ? 1 : 0;
$messageRetard  = '';

if ($ticket['prioritaire'] && !$estPrioritaire) {
    $messageRetard = 'Priorité expirée pour cause de retard — patient réinséré en file normale';
}

// je marque le ticket comme consommé
$stmt = $db->prepare("
    UPDATE tickets
    SET statut = 'consomme', scanne_par = ?, scanne_at = NOW(), prioritaire = ?
    WHERE id = ?
");
$stmt->execute([$userConnecte['utilisateur_id'], $prioriteFinale, $ticket['id']]);

// ── je marque le RDV comme "en_cours" dans la file d'attente ──
$stmt = $db->prepare("
    UPDATE rendez_vous
    SET statut = 'consomme', statut_file = 'en_cours'
    WHERE id = ?
");
$stmt->execute([$ticket['rdv_id']]);

// ── je notifie le patient suivant dans la file ──
// (celui qui a numero_file = numero actuel + 1, même service, même jour)
$numeroActuel = (int)$ticket['numero_file'];

$stmtSuivant = $db->prepare("
    SELECT r.id AS rdv_id, r.patient_id, r.patient_nom, r.patient_prenom, r.numero_file,
           u.push_token
    FROM rendez_vous r
    JOIN utilisateurs u ON u.id = r.patient_id
    WHERE r.service_id = ?
      AND r.date_rdv = ?
      AND r.numero_file = ?
      AND r.statut NOT IN ('annule', 'expire', 'consomme')
    LIMIT 1
");
$stmtSuivant->execute([
    $ticket['service_id'],
    $ticket['date_rdv'],
    $numeroActuel + 1,
]);
$patientSuivant = $stmtSuivant->fetch();

if ($patientSuivant && $patientSuivant['push_token']) {
    envoyerNotificationPush(
        $patientSuivant['patient_id'],
        '🔔 Préparez-vous !',
        'Vous êtes le prochain en ' . $ticket['service_nom'] . '. Présentez-vous à l\'accueil.',
        [
            'type'     => 'file_suivant',
            'rdv_id'   => $patientSuivant['rdv_id'],
            'hopital_id' => isset($ticket['hopital_id']) ? $ticket['hopital_id'] : null,
        ]
    );

    // je log la notification dans la table notifications
    $db->prepare("
        INSERT INTO notifications (utilisateur_id, rdv_id, type, canal, message)
        VALUES (?, ?, 'file_suivant', 'push', ?)
    ")->execute([
        $patientSuivant['patient_id'],
        $patientSuivant['rdv_id'],
        'Vous êtes le prochain en ' . $ticket['service_nom'] . '. Présentez-vous à l\'accueil.',
    ]);
}

// je log le scan pour la traçabilité
$stmt = $db->prepare("
    INSERT INTO audit_log (utilisateur_id, action, table_cible, enregistrement_id, details)
    VALUES (?, 'scanner_ticket', 'tickets', ?, ?)
");
$stmt->execute([
    $userConnecte['utilisateur_id'],
    $ticket['id'],
    json_encode([
        'code_qr'          => $body['code_qr'],
        'prioritaire'      => $prioriteFinale,
        'heure_scan'       => date('H:i:s'),
        'numero_file'      => $numeroActuel,
        'suivant_notifie'  => $patientSuivant ? $patientSuivant['patient_id'] : null,
    ])
]);

repondre([
    'succes'      => true,
    'message'     => $messageRetard ?: 'Patient enregistré avec succès',
    'prioritaire' => (bool) $prioriteFinale,
    'alerte'      => $messageRetard,
    'patient'     => [
        'nom'         => $ticket['patient_nom'],
        'prenom'      => $ticket['patient_prenom'],
        'motif'       => $ticket['motif'],
        'service'     => $ticket['service_nom'],
        'heure_rdv'   => $ticket['heure_rdv'],
        'numero_file' => $numeroActuel,
    ],
    'suivant_notifie' => $patientSuivant ? [
        'nom'         => $patientSuivant['patient_nom'],
        'prenom'      => $patientSuivant['patient_prenom'],
        'numero_file' => $patientSuivant['numero_file'],
    ] : null,
]);