<?php
// ============================================
// SEN RDV SANTÉ+ — Gestion des services
// GET    /api/admin/services.php?hopital_id=X → liste des services
// POST   /api/admin/services.php               → créer un service
// PUT    /api/admin/services.php               → modifier un service
// DELETE /api/admin/services.php?id=1          → désactiver un service
// Headers: Authorization: Bearer {token admin}
//
// Champs mode_rdv et quota_journalier :
//   mode_rdv         ENUM('creneaux','quota')  default 'creneaux'
//   quota_journalier INT NULL  — nb max patients/jour en mode quota
// ============================================

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

$userConnecte = verifierToken();

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

$db             = getDB();
$method         = $_SERVER['REQUEST_METHOD'];
$isSuperAdmin   = $userConnecte['role'] === 'super_admin';
$isDirecteur    = $userConnecte['role'] === 'directeur_regional';

function getHopitalId($userConnecte, $source = []) {
    if ($userConnecte['role'] === 'super_admin' || $userConnecte['role'] === 'directeur_regional') {
        $id = $source['hopital_id'] ?? null;
        if (!$id) repondre(['erreur' => 'hopital_id obligatoire'], 422);
        return (int)$id;
    }
    if (empty($userConnecte['hopital_id'])) {
        repondre(['erreur' => 'hopital_id manquant dans votre compte'], 400);
    }
    return (int)$userConnecte['hopital_id'];
}

function validerModeRdv($mode) {
    $modes = ['creneaux', 'quota'];
    if (!in_array($mode, $modes)) {
        repondre(['erreur' => 'mode_rdv invalide. Valeurs acceptées : creneaux, quota'], 422);
    }
}

// Pour le directeur, le POST/PUT/DELETE est interdit (lecture seule)
if ($isDirecteur && $method !== 'GET') {
    repondre(['erreur' => 'Accès en lecture seule pour le directeur régional'], 403);
}

// ============================================================
// GET — liste des services d'un hôpital
// ============================================================
if ($method === 'GET') {
    $hopitalId = null;

    if ($isSuperAdmin || $isDirecteur) {
        $hopitalId = $_GET['hopital_id'] ?? null;
        if ($isDirecteur && !$hopitalId) {
            // Sans hopital_id, retourne tous les services de tous ses hôpitaux
            $stmtDH = $db->prepare("SELECT hopital_id FROM directeur_hopitaux WHERE directeur_id = ?");
            $stmtDH->execute([$userConnecte['utilisateur_id']]);
            $hopitauxIds = $stmtDH->fetchAll(PDO::FETCH_COLUMN);
            if (empty($hopitauxIds)) {
                repondre(['succes' => true, 'services' => []]);
            }
            $placeholders = implode(',', array_fill(0, count($hopitauxIds), '?'));
            $stmt = $db->prepare("
                SELECT s.id, s.nom, s.description,
                       s.quota_rdv_jour, s.duree_consultation,
                       s.mode_rdv, s.quota_journalier,
                       s.actif, s.hopital_id,
                       h.nom AS hopital_nom,
                       COUNT(DISTINCT gs.gerant_id) AS nb_gerants,
                       COUNT(DISTINCT c.id)         AS nb_creneaux
                FROM services s
                JOIN hopitaux h ON h.id = s.hopital_id
                LEFT JOIN gerant_services gs ON gs.service_id = s.id
                LEFT JOIN creneaux c ON c.service_id = s.id AND c.disponible = 1
                WHERE s.hopital_id IN ($placeholders)
                GROUP BY s.id
                ORDER BY h.nom ASC, s.nom ASC
            ");
            $stmt->execute($hopitauxIds);
            repondre(['succes' => true, 'services' => $stmt->fetchAll(PDO::FETCH_ASSOC)]);
        }
        if (!$hopitalId) {
            repondre(['erreur' => 'hopital_id obligatoire'], 422);
        }
    } else {
        $hopitalId = getHopitalId($userConnecte, $_GET);
    }

    $stmt = $db->prepare("
        SELECT s.id, s.nom, s.description,
               s.quota_rdv_jour, s.duree_consultation,
               s.mode_rdv, s.quota_journalier,
               s.actif,
               COUNT(DISTINCT gs.gerant_id) AS nb_gerants,
               COUNT(DISTINCT c.id)         AS nb_creneaux
        FROM services s
        LEFT JOIN gerant_services gs ON gs.service_id = s.id
        LEFT JOIN creneaux c ON c.service_id = s.id AND c.disponible = 1
        WHERE s.hopital_id = ?
        GROUP BY s.id
        ORDER BY s.nom ASC
    ");
    $stmt->execute([$hopitalId]);

    repondre(['succes' => true, 'services' => $stmt->fetchAll(PDO::FETCH_ASSOC)]);
}

// ============================================================
// POST — créer un service
// ============================================================
if ($method === 'POST') {
    $body      = getBody();
    $hopitalId = getHopitalId($userConnecte, $body);

    validerChamps($body, ['nom', 'quota_rdv_jour', 'duree_consultation']);

    $modeRdv = $body['mode_rdv'] ?? 'creneaux';
    validerModeRdv($modeRdv);

    if ($modeRdv === 'quota' && empty($body['quota_journalier'])) {
        repondre(['erreur' => 'quota_journalier obligatoire en mode quota'], 422);
    }
    $quotaJournalier = ($modeRdv === 'quota') ? (int)$body['quota_journalier'] : null;

    $stmt = $db->prepare("SELECT id FROM services WHERE hopital_id = ? AND nom = ?");
    $stmt->execute([$hopitalId, trim($body['nom'])]);
    if ($stmt->fetch()) {
        repondre(['erreur' => 'Un service avec ce nom existe déjà dans cet hôpital'], 409);
    }

    $stmt = $db->prepare("
        INSERT INTO services
            (hopital_id, nom, description, quota_rdv_jour, duree_consultation,
             mode_rdv, quota_journalier)
        VALUES (?, ?, ?, ?, ?, ?, ?)
    ");
    $stmt->execute([
        $hopitalId,
        trim($body['nom']),
        $body['description'] ?? null,
        (int)$body['quota_rdv_jour'],
        (int)$body['duree_consultation'],
        $modeRdv,
        $quotaJournalier,
    ]);

    repondre([
        'succes'  => true,
        'message' => 'Service créé avec succès',
        'id'      => $db->lastInsertId(),
        'mode_rdv'         => $modeRdv,
        'quota_journalier' => $quotaJournalier,
    ], 201);
}

// ============================================================
// PUT — modifier un service
// ============================================================
if ($method === 'PUT') {
    $body      = getBody();
    $hopitalId = getHopitalId($userConnecte, $body);

    validerChamps($body, ['id']);

    $stmt = $db->prepare("SELECT id, mode_rdv FROM services WHERE id = ? AND hopital_id = ?");
    $stmt->execute([$body['id'], $hopitalId]);
    $serviceActuel = $stmt->fetch(PDO::FETCH_ASSOC);
    if (!$serviceActuel) {
        repondre(['erreur' => 'Service introuvable'], 404);
    }

    $champs = [];
    $params = [];

    if (!empty($body['nom']))                { $champs[] = 'nom = ?';                $params[] = trim($body['nom']); }
    if (isset($body['description']))         { $champs[] = 'description = ?';        $params[] = $body['description']; }
    if (!empty($body['quota_rdv_jour']))     { $champs[] = 'quota_rdv_jour = ?';     $params[] = (int)$body['quota_rdv_jour']; }
    if (!empty($body['duree_consultation'])) { $champs[] = 'duree_consultation = ?'; $params[] = (int)$body['duree_consultation']; }
    if (isset($body['actif']))               { $champs[] = 'actif = ?';              $params[] = $body['actif'] ? 1 : 0; }

    if (isset($body['mode_rdv'])) {
        validerModeRdv($body['mode_rdv']);
        $champs[] = 'mode_rdv = ?';
        $params[] = $body['mode_rdv'];

        if ($body['mode_rdv'] === 'quota') {
            $quota = $body['quota_journalier'] ?? null;
            if (!$quota || (int)$quota <= 0) {
                repondre(['erreur' => 'quota_journalier obligatoire pour passer en mode quota (> 0)'], 422);
            }
            $champs[] = 'quota_journalier = ?';
            $params[] = (int)$quota;
        }

        if ($body['mode_rdv'] === 'creneaux') {
            $champs[] = 'quota_journalier = ?';
            $params[] = null;
        }

    } elseif (isset($body['quota_journalier'])) {
        $modeActuel = $serviceActuel['mode_rdv'];
        if ($modeActuel !== 'quota') {
            repondre(['erreur' => 'quota_journalier ne peut être défini qu\'en mode quota'], 422);
        }
        if ((int)$body['quota_journalier'] <= 0) {
            repondre(['erreur' => 'quota_journalier doit être supérieur à 0'], 422);
        }
        $champs[] = 'quota_journalier = ?';
        $params[] = (int)$body['quota_journalier'];
    }

    if (empty($champs)) {
        repondre(['erreur' => 'Aucun champ à modifier'], 422);
    }

    $params[] = $body['id'];
    $stmt = $db->prepare("UPDATE services SET " . implode(', ', $champs) . " WHERE id = ?");
    $stmt->execute($params);

    $stmtGet = $db->prepare("
        SELECT id, nom, description, quota_rdv_jour, duree_consultation,
               mode_rdv, quota_journalier, actif
        FROM services WHERE id = ?
    ");
    $stmtGet->execute([$body['id']]);

    repondre([
        'succes'  => true,
        'message' => 'Service mis à jour avec succès',
        'service' => $stmtGet->fetch(PDO::FETCH_ASSOC),
    ]);
}

// ============================================================
// DELETE — désactiver un service
// ============================================================
if ($method === 'DELETE') {
    if (empty($_GET['id'])) repondre(['erreur' => 'id du service obligatoire'], 422);

    $hopitalId = getHopitalId($userConnecte, $_GET);

    $stmt = $db->prepare("
        SELECT COUNT(*) AS total FROM rendez_vous
        WHERE service_id = ? AND statut IN ('en_attente','confirme','paye')
        AND date_rdv >= CURDATE()
    ");
    $stmt->execute([$_GET['id']]);
    $rdvsActifs = (int)$stmt->fetch(PDO::FETCH_ASSOC)['total'];

    if ($rdvsActifs > 0) {
        repondre(['erreur' => "Impossible — {$rdvsActifs} RDV actif(s) en cours sur ce service"], 409);
    }

    $stmt = $db->prepare("UPDATE services SET actif = 0 WHERE id = ? AND hopital_id = ?");
    $stmt->execute([$_GET['id'], $hopitalId]);

    repondre(['succes' => true, 'message' => 'Service désactivé avec succès']);
}

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