<?php
// ============================================
// SEN RDV SANTÉ+ — Envoi notifications (push + SMS)
// POST /api/alertes/notifier.php
// Body: { "service_id": 1, "date_rdv": "2025-03-17", "heure_rdv": "09:00" }
// Appelé par : gérant à l'ouverture d'une plage, annulation RDV, CRON
// ============================================

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

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

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

$body = getBody();
validerChamps($body, ['service_id', 'date_rdv', 'heure_rdv']);

$db = getDB();

// je récupère les infos du service + hopital_id pour la navigation mobile
$stmt = $db->prepare("
    SELECT s.nom AS service_nom, h.id AS hopital_id, h.nom AS hopital_nom
    FROM services s
    JOIN hopitaux h ON h.id = s.hopital_id
    WHERE s.id = ?
");
$stmt->execute([$body['service_id']]);
$service = $stmt->fetch(PDO::FETCH_ASSOC);

if (!$service) {
    repondre(['erreur' => 'Service introuvable'], 404);
}

// je récupère les patients avec une alerte active pour ce service
$stmt = $db->prepare("
    SELECT a.patient_id, u.telephone, u.nom, u.prenom, u.push_token
    FROM alertes_disponibilite a
    JOIN utilisateurs u ON u.id = a.patient_id
    WHERE a.service_id = ? AND a.actif = 1
    ORDER BY a.created_at ASC
");
$stmt->execute([$body['service_id']]);
$patients = $stmt->fetchAll(PDO::FETCH_ASSOC);

if (empty($patients)) {
    repondre(['succes' => true, 'message' => 'Aucun patient en attente', 'notifie' => 0]);
}

$dateFormate = date('d/m/Y', strtotime($body['date_rdv']));
$heure       = substr($body['heure_rdv'], 0, 5);
$titreNotif  = '🏥 Place disponible !';
$corpsNotif  = "RDV le {$dateFormate} à {$heure} — {$service['service_nom']} ({$service['hopital_nom']}). Premier arrivé, premier servi !";
$msgSms      = "SEN RDV SANTÉ+ : Place dispo le {$dateFormate} à {$heure} en {$service['service_nom']} - {$service['hopital_nom']}. Connectez-vous vite !";

$expoPushTokens = [];
$nbNotifie      = 0;

foreach ($patients as $patient) {
    if (!empty($patient['push_token'])) {
        $expoPushTokens[] = [
            'to'    => $patient['push_token'],
            'title' => $titreNotif,
            'body'  => $corpsNotif,
            'data'  => [
                'type'       => 'flash',
                'service_id' => (int)$body['service_id'],
                'hopital_id' => (int)$service['hopital_id'], // ← navigation au tap
                'date_rdv'   => $body['date_rdv'],
                'heure_rdv'  => $body['heure_rdv'],
            ],
            'sound'     => 'default',
            'priority'  => 'high',
            'channelId' => 'senrdv',
        ];
    }

    $db->prepare("
        INSERT INTO notifications (utilisateur_id, type, canal, message)
        VALUES (?, 'flash', 'sms', ?)
    ")->execute([$patient['patient_id'], $msgSms]);

    $nbNotifie++;
}

// envoi push Expo
$nbPushEnvoyes = 0;
$erreursPush   = [];

if (!empty($expoPushTokens)) {
    $lots = array_chunk($expoPushTokens, 100);
    foreach ($lots as $lot) {
        $reponse = envoyerPushExpo($lot);
        if ($reponse['succes']) {
            $nbPushEnvoyes += count($lot);
        } else {
            $erreursPush[] = $reponse['erreur'];
        }
    }
}

// je désactive les alertes après notification
$db->prepare("UPDATE alertes_disponibilite SET actif = 0 WHERE service_id = ? AND actif = 1")
   ->execute([$body['service_id']]);

repondre([
    'succes'         => true,
    'message'        => "{$nbNotifie} patient(s) notifié(s)",
    'notifie'        => $nbNotifie,
    'push_envoyes'   => $nbPushEnvoyes,
    'sms_en_attente' => $nbNotifie,
    'erreurs_push'   => $erreursPush,
]);

// ════════════════════════════════════
// FONCTION : envoi push via Expo API
// ════════════════════════════════════
function envoyerPushExpo(array $messages): array {
    $ch = curl_init('https://exp.host/--/api/v2/push/send');
    curl_setopt_array($ch, [
        CURLOPT_POST           => true,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER     => [
            'Content-Type: application/json', // ← pas d'espaces après les :
            'Accept: application/json',
            'Accept-Encoding: gzip, deflate',
        ],
        CURLOPT_POSTFIELDS     => json_encode($messages),
        CURLOPT_TIMEOUT        => 15,
    ]);

    $reponse    = curl_exec($ch);
    $httpCode   = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $curlErreur = curl_error($ch);
    curl_close($ch);

    if ($curlErreur) {
        error_log("Expo push cURL erreur: $curlErreur");
        return ['succes' => false, 'erreur' => "cURL : {$curlErreur}"];
    }
    if ($httpCode !== 200) {
        error_log("Expo push HTTP {$httpCode}: $reponse");
        return ['succes' => false, 'erreur' => "HTTP {$httpCode} : {$reponse}"];
    }

    $data = json_decode($reponse, true);
    if (!empty($data['data'])) {
        foreach ($data['data'] as $item) {
            if (($item['status'] ?? '') === 'error') {
                error_log("Expo push token invalide: " . json_encode($item));
            }
        }
    }

    return ['succes' => true];
}