<?php
// ============================================
// SEN RDV SANTÉ+ — Gestion des créneaux horaires
// GET    /api/admin/creneaux.php?service_id=1
// POST   /api/admin/creneaux.php           → créer un créneau
// PUT    /api/admin/creneaux.php           → modifier un créneau
// DELETE /api/admin/creneaux.php?id=1      → supprimer un créneau
// Headers: Authorization: Bearer {token admin ou gerant}
// ============================================

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

$userConnecte = verifierToken();

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

$db     = getDB();
$method = $_SERVER['REQUEST_METHOD'];

// ---- GET : liste des créneaux d'un service ----
if ($method === 'GET') {

    if (empty($_GET['service_id'])) {
        repondre(['erreur' => 'service_id obligatoire'], 422);
    }

    $stmt = $db->prepare("
        SELECT id, jour_semaine, date_specifique, heure_debut, heure_fin, disponible
        FROM creneaux
        WHERE service_id = ?
        ORDER BY jour_semaine ASC, heure_debut ASC
    ");
    $stmt->execute([$_GET['service_id']]);

    // je formate le jour de la semaine en texte lisible pour l'interface
    $jours = ['', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi', 'Dimanche'];
    $creneaux = $stmt->fetchAll();

    foreach ($creneaux as &$c) {
        $c['jour_label'] = $c['jour_semaine'] ? $jours[$c['jour_semaine']] : 'Date spécifique';
    }

    repondre(['succes' => true, 'creneaux' => $creneaux]);
}

// ---- POST : créer un ou plusieurs créneaux ----
if ($method === 'POST') {

    $body = getBody();
    validerChamps($body, ['service_id', 'heure_debut', 'heure_fin']);

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

    // je vérifie que heure_fin est bien après heure_debut
    if ($body['heure_debut'] >= $body['heure_fin']) {
        repondre(['erreur' => 'L\'heure de fin doit être après l\'heure de début'], 422);
    }

    $stmt = $db->prepare("
        INSERT INTO creneaux (service_id, jour_semaine, date_specifique, heure_debut, heure_fin)
        VALUES (?, ?, ?, ?, ?)
    ");
    $stmt->execute([
        $body['service_id'],
        $body['jour_semaine'] ?? null,
        $body['date_specifique'] ?? null,
        $body['heure_debut'],
        $body['heure_fin']
    ]);

    repondre([
        'succes'  => true,
        'message' => 'Créneau créé avec succès',
        'id'      => $db->lastInsertId()
    ], 201);
}

// ---- PUT : bloquer ou débloquer un créneau ----
if ($method === 'PUT') {

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

    $stmt = $db->prepare("UPDATE creneaux SET disponible = ? WHERE id = ?");
    $stmt->execute([$body['disponible'] ? 1 : 0, $body['id']]);

    // si on bloque un créneau, je notifie les patients qui avaient un RDV dessus
    if (!$body['disponible']) {
        $stmt = $db->prepare("
            SELECT r.patient_id, r.id AS rdv_id, r.date_rdv, r.heure_rdv
            FROM rendez_vous r
            WHERE r.creneau_id = ? AND r.statut IN ('en_attente', 'confirme')
            AND r.date_rdv >= CURDATE()
        ");
        $stmt->execute([$body['id']]);
        $rdvsConcernes = $stmt->fetchAll();

        foreach ($rdvsConcernes as $rdv) {
            $message = "SEN RDV SANTÉ+ : Le créneau de " . $rdv['heure_rdv'] . " le " .
                       $rdv['date_rdv'] . " n'est plus disponible. Veuillez replanifier votre RDV.";

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

    repondre(['succes' => true, 'message' => 'Créneau mis à jour avec succès']);
}

// ---- DELETE : supprimer un créneau ----
if ($method === 'DELETE') {

    if (empty($_GET['id'])) {
        repondre(['erreur' => 'id du créneau obligatoire'], 422);
    }

    $stmt = $db->prepare("DELETE FROM creneaux WHERE id = ?");
    $stmt->execute([$_GET['id']]);

    repondre(['succes' => true, 'message' => 'Créneau supprimé avec succès']);
}

repondre(['erreur' => 'Méthode non autorisée'], 405);