<?php
// ============================================
// SEN RDV SANTÉ+ — Stats pour directeur régional
// GET /api/admin/stats_directeur.php
// GET /api/admin/stats_directeur.php?date_debut=2026-05-01&date_fin=2026-05-05
// GET /api/admin/stats_directeur.php?hopital_id=1
// GET /api/admin/stats_directeur.php?service_id=1
// Headers: Authorization: Bearer {token directeur_regional}
// ============================================
require_once '../config/helpers.php';
require_once '../config/database.php';

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

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

$db = getDB();

// Récupérer les IDs des hôpitaux du directeur
$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) && $userConnecte['role'] !== 'super_admin') {
    repondre(['erreur' => 'Aucun hôpital rattaché à votre compte'], 400);
}

// Dates
$dateDebut = $_GET['date_debut'] ?? date('Y-m-d');
$dateFin   = $_GET['date_fin']   ?? date('Y-m-d');

// Filtres optionnels
$filtreHopital = '';
$filtreService = '';
$params = [$dateDebut, $dateFin];

if (!empty($_GET['hopital_id']) && ($userConnecte['role'] === 'super_admin' || in_array((int)$_GET['hopital_id'], $hopitauxIds))) {
    $filtreHopital = "AND s.hopital_id = ?";
    $params[] = (int)$_GET['hopital_id'];
}

if (!empty($_GET['service_id'])) {
    $filtreService = "AND r.service_id = ?";
    $params[] = (int)$_GET['service_id'];
}

// Restreindre aux hôpitaux du directeur (sauf super_admin sans filtre)
if ($userConnecte['role'] !== 'super_admin' || !empty($_GET['hopital_id'])) {
    if (empty($filtreHopital)) {
        $placeholders = implode(',', array_fill(0, count($hopitauxIds), '?'));
        $filtreHopital = "AND s.hopital_id IN ($placeholders)";
        $params = array_merge([$dateDebut, $dateFin], $hopitauxIds);
        if (!empty($_GET['service_id'])) {
            $filtreService = "AND r.service_id = ?";
            $params[] = (int)$_GET['service_id'];
        }
    }
}

// Stats par statut
$stmt = $db->prepare("
    SELECT r.statut, COUNT(*) AS nb
    FROM rendez_vous r
    JOIN services s ON s.id = r.service_id
    WHERE r.date_rdv BETWEEN ? AND ?
    $filtreHopital
    $filtreService
    GROUP BY r.statut
");
$stmt->execute($params);
$statsRaw = $stmt->fetchAll(PDO::FETCH_ASSOC);

$stats = [
    'en_attente' => 0,
    'confirme'   => 0,
    'paye'       => 0,
    'consomme'   => 0,
    'annule'     => 0,
];
foreach ($statsRaw as $row) {
    if (isset($stats[$row['statut']])) {
        $stats[$row['statut']] = (int)$row['nb'];
    }
}

// Stats par hôpital
$stmtH = $db->prepare("
    SELECT h.id, h.nom, COUNT(r.id) AS nb
    FROM rendez_vous r
    JOIN services s ON s.id = r.service_id
    JOIN hopitaux h ON h.id = s.hopital_id
    WHERE r.date_rdv BETWEEN ? AND ?
    $filtreHopital
    $filtreService
    GROUP BY h.id, h.nom
    ORDER BY nb DESC
");
$stmtH->execute($params);
$parHopitalRaw = $stmtH->fetchAll(PDO::FETCH_ASSOC);

$parHopital = [];
foreach ($parHopitalRaw as $row) {
    $parHopital[$row['nom']] = (int)$row['nb'];
}

// RDVs de la période
$stmtR = $db->prepare("
    SELECT r.id, r.patient_nom, r.patient_prenom, r.date_rdv, r.heure_rdv, r.statut,
           s.nom AS service_nom, h.nom AS hopital_nom
    FROM rendez_vous r
    JOIN services s ON s.id = r.service_id
    JOIN hopitaux h ON h.id = s.hopital_id
    WHERE r.date_rdv BETWEEN ? AND ?
    $filtreHopital
    $filtreService
    ORDER BY r.date_rdv DESC, r.heure_rdv DESC
    LIMIT 50
");
$stmtR->execute($params);
$rdvs = $stmtR->fetchAll(PDO::FETCH_ASSOC);

repondre([
    'succes'     => true,
    'stats'      => $stats,
    'par_hopital'=> $parHopital,
    'total'      => array_sum($stats),
    'rdvs'       => $rdvs,
    'periode'    => ['debut' => $dateDebut, 'fin' => $dateFin],
]);