<?php
// ============================================
// SEN RDV SANTÉ+ — Gestion urgences (fermeture, mass notif)
// POST /api/admin/urgence.php
// Body: {
//   "action": "fermeture_service",
//   "service_id": 1,
//   "message": "Service fermé pour grève"
// }
// ou {
//   "action": "communication_masse",
//   "service_id": 1,
//   "message": "Votre RDV est décalé au bâtiment B"
// }
// ============================================

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

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

$userConnecte = verifierToken();

if (!in_array($userConnecte['role'], ['admin_hopital', 'super_admin'])) {
    repondre(['erreur' => 'Accès non autorisé'], 403);
}

$body = getBody();
validerChamps($body, ['action', 'service_id', 'message']);

$db = getDB();

// je vérifie que le service appartient à l'hôpital de cet admin
if ($userConnecte['role'] === 'admin_hopital') {
    $stmt = $db->prepare("SELECT id FROM services WHERE id = ? AND hopital_id = ?");
    $stmt->execute([$body['service_id'], $userConnecte['hopital_id']]);
    if (!$stmt->fetch()) {
        repondre(['erreur' => 'Service introuvable ou non autorisé'], 403);
    }
}

// ---- FERMETURE EXCEPTIONNELLE ----
if ($body['action'] === 'fermeture_service') {

    // je récupère tous les RDVs actifs futurs de ce service
    $stmt = $db->prepare("
        SELECT r.id, r.patient_id, r.date_rdv, r.heure_rdv,
               p.id AS paiement_id, p.montant, p.statut AS paiement_statut
        FROM rendez_vous r
        LEFT JOIN paiements p ON p.rdv_id = r.id AND p.statut = 'valide'
        WHERE r.service_id = ?
        AND r.statut IN ('en_attente', 'confirme', 'paye')
        AND r.date_rdv >= CURDATE()
    ");
    $stmt->execute([$body['service_id']]);
    $rdvs = $stmt->fetchAll();

    $nbAnnules    = 0;
    $nbRembourses = 0;

    foreach ($rdvs as $rdv) {
        // j'annule le RDV
        $stmt = $db->prepare("
            UPDATE rendez_vous SET statut = 'annule', annule_par = 'hopital',
            annule_at = NOW(), raison_annulation = ?
            WHERE id = ?
        ");
        $stmt->execute([$body['message'], $rdv['id']]);

        // je rembourse automatiquement si paiement validé
        if ($rdv['paiement_id']) {
            $stmt = $db->prepare("UPDATE paiements SET statut = 'rembourse', rembourse_at = NOW() WHERE id = ?");
            $stmt->execute([$rdv['paiement_id']]);
            $nbRembourses++;
        }

        // je notifie chaque patient
        $notifMessage = "SEN RDV SANTÉ+ : ⚠️ " . $body['message'] .
                       " Votre RDV du " . $rdv['date_rdv'] . " à " . substr($rdv['heure_rdv'], 0, 5) .
                       " est annulé. " . ($rdv['paiement_id'] ? "Remboursement total en cours." : "");

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

        // je notifie aussi via push
        envoyerNotificationPush(
            $rdv['patient_id'],
            '⚠️ RDV annulé',
            $body['message'],
            ['type' => 'fermeture', 'rdv_id' => $rdv['id']]
        );

        $nbAnnules++;
    }

    // je bloque aussi les créneaux du service pour la journée
    $stmt = $db->prepare("UPDATE creneaux SET disponible = 0 WHERE service_id = ?");
    $stmt->execute([$body['service_id']]);

    // je log l'action
    $stmt = $db->prepare("
        INSERT INTO audit_log (utilisateur_id, action, table_cible, enregistrement_id, details)
        VALUES (?, 'fermeture_service', 'services', ?, ?)
    ");
    $stmt->execute([
        $userConnecte['utilisateur_id'],
        $body['service_id'],
        json_encode(['message' => $body['message'], 'nb_annules' => $nbAnnules])
    ]);

    repondre([
        'succes'       => true,
        'message'      => "$nbAnnules RDV annulé(s) — $nbRembourses remboursement(s) lancé(s)",
        'nb_annules'   => $nbAnnules,
        'nb_rembourses' => $nbRembourses,
    ]);
}

// ---- COMMUNICATION DE MASSE ----
if ($body['action'] === 'communication_masse') {

    // je récupère tous les patients avec un RDV actif futur dans ce service
    $stmt = $db->prepare("
        SELECT DISTINCT r.patient_id, r.id AS rdv_id
        FROM rendez_vous r
        WHERE r.service_id = ?
        AND r.statut IN ('en_attente', 'confirme', 'paye')
        AND r.date_rdv >= CURDATE()
    ");
    $stmt->execute([$body['service_id']]);
    $rdvs = $stmt->fetchAll();

    $nbNotifies = 0;

    foreach ($rdvs as $rdv) {
        $stmt = $db->prepare("
            INSERT INTO notifications (utilisateur_id, rdv_id, type, canal, message)
            VALUES (?, ?, 'rappel', 'sms', ?)
        ");
        $stmt->execute([$rdv['patient_id'], $rdv['rdv_id'], "SEN RDV SANTÉ+ : " . $body['message']]);

        envoyerNotificationPush(
            $rdv['patient_id'],
            '📢 Information importante',
            $body['message'],
            ['type' => 'communication', 'rdv_id' => $rdv['rdv_id']]
        );

        $nbNotifies++;
    }

    repondre([
        'succes'     => true,
        'message'    => "$nbNotifies patient(s) notifié(s)",
        'nb_notifies' => $nbNotifies,
    ]);
}

repondre(['erreur' => 'Action invalide'], 422);