<?php

ini_set('display_errors', 0);
error_reporting(E_ALL);
ini_set('log_errors', 1);
ini_set('error_log', __DIR__ . '/../../debug.log');
// ============================================
// SEN RDV SANTÉ+ — Liste des RDV pour le gérant
// GET /api/rdv/liste_gerant.php
// Headers: Authorization: Bearer {token gérant/admin/directeur}
// ============================================
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'], ['gerant', 'admin_hopital', 'directeur_regional'])) {
    repondre(['erreur' => 'Accès réservé au personnel de l\'hôpital'], 403);
}

$db = getDB();

// ═══════════════════════════════════════
// ✅ POINT 7 — EXPIRE AUTO DES RDV PASSÉS
// ═══════════════════════════════════════
$db->prepare("
    UPDATE rendez_vous 
    SET statut = 'expire' 
    WHERE date_rdv < CURDATE() 
      AND statut NOT IN ('consomme', 'annule', 'expire')
")->execute();

$db->prepare("
    UPDATE rendez_vous 
    SET statut = 'expire' 
    WHERE date_rdv = CURDATE() 
      AND heure_rdv < CURTIME()
      AND statut NOT IN ('consomme', 'annule', 'expire')
")->execute();
// ═══════════════════════════════════════

// Hôpital (pour admin_hopital et gerant)
if ($userConnecte['role'] !== 'directeur_regional') {
    $stmtH = $db->prepare("SELECT nom FROM hopitaux WHERE id = ?");
    $stmtH->execute([$userConnecte['hopital_id']]);
    $hopital     = $stmtH->fetch(PDO::FETCH_ASSOC);
    $hopital_nom = $hopital ? $hopital['nom'] : 'Hôpital';
} else {
    $hopital_nom = 'Direction Régionale';
}

// ═══════════════════════════════════════
// DÉTERMINATION DU PÉRIMÈTRE
// ═══════════════════════════════════════
if ($userConnecte['role'] === 'directeur_regional') {
    // Directeur régional : tous les hôpitaux qu'il supervise
    $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,
            'stats'       => ['en_attente' => 0, 'confirme' => 0, 'paye' => 0, 'consomme' => 0, 'annule' => 0],
            'total'       => 0,
            'hopital_nom' => $hopital_nom,
            'services'    => [],
            'rdvs'        => [],
        ]);
    }
    
    // Filtrer par hôpital si demandé
    if (!empty($_GET['hopital_id'])) {
        $hopitalId = (int)$_GET['hopital_id'];
        if (!in_array($hopitalId, $hopitauxIds)) {
            repondre(['erreur' => 'Hôpital non autorisé'], 403);
        }
        $placeholders = '?';
        $filtreParams = [$hopitalId];
    } else {
        $placeholders = implode(',', array_fill(0, count($hopitauxIds), '?'));
        $filtreParams = $hopitauxIds;
    }
    $filtreSql = "AND s.hopital_id IN ($placeholders)";
    
} elseif ($userConnecte['role'] === 'admin_hopital') {
    if (empty($userConnecte['hopital_id'])) {
        repondre(['erreur' => 'hopital_id manquant dans votre compte'], 400);
    }
    $filtreSql    = "AND s.hopital_id = ?";
    $filtreParams = [$userConnecte['hopital_id']];
} else {
    $serviceIds = $userConnecte['service_ids'] ?? [];
    if (empty($serviceIds)) {
        repondre(['erreur' => 'Aucun service rattaché à votre compte'], 400);
    }
    $placeholders = implode(',', array_fill(0, count($serviceIds), '?'));
    $filtreSql    = "AND r.service_id IN ($placeholders)";
    $filtreParams = $serviceIds;
}

$sql = "
    SELECT r.id, r.patient_id, r.patient_nom, r.patient_prenom, r.patient_age,
           r.motif, r.date_rdv, r.heure_rdv,
           r.statut AS statut,
           r.numero_file, r.statut_file,
           r.urgent,
           r.justificatif_path, r.date_proposee, r.heure_proposee,
           r.created_at, r.service_id,
           s.nom AS service_nom, s.mode_rdv AS service_mode_rdv,
           s.hopital_id,
           h.nom AS hopital_nom,
           t.code_qr, t.prioritaire,
           t.statut AS ticket_statut,
           p.montant,
           p.statut AS paiement_statut,
           po.id AS plage_id,
           po.quota AS plage_quota,
           po.mode_rdv AS plage_mode_rdv
    FROM rendez_vous r
    JOIN services s ON s.id = r.service_id
    JOIN hopitaux h ON h.id = s.hopital_id
    LEFT JOIN tickets t ON t.rdv_id = r.id
    LEFT JOIN paiements p ON p.rdv_id = r.id
    LEFT JOIN plages_ouvertes po
           ON po.service_id = r.service_id
          AND po.date_plage = r.date_rdv
          AND po.actif = 1
    WHERE 1=1 $filtreSql
";
$params = $filtreParams;

if (!empty($_GET['recherche'])) {
    $q    = '%' . $_GET['recherche'] . '%';
    $sql .= " AND (r.patient_nom LIKE ? OR r.patient_prenom LIKE ? OR t.code_qr LIKE ?)";
    $params[] = $q;
    $params[] = $q;
    $params[] = $_GET['recherche'];
}

if (!empty($_GET['date'])) {
    $sql .= " AND r.date_rdv = ?";
    $params[] = $_GET['date'];
} elseif (!empty($_GET['date_debut']) && !empty($_GET['date_fin'])) {
    $sql .= " AND r.date_rdv BETWEEN ? AND ?";
    $params[] = $_GET['date_debut'];
    $params[] = $_GET['date_fin'];
} else {
    $sql .= " AND r.date_rdv >= CURDATE()";
}

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

if (!empty($_GET['service_id'])) {
    if (
        $userConnecte['role'] === 'gerant' &&
        !in_array((int)$_GET['service_id'], $userConnecte['service_ids'] ?? [])
    ) {
        repondre(['erreur' => 'Ce service ne vous appartient pas'], 403);
    }
    $sql .= " AND r.service_id = ?";
    $params[] = (int)$_GET['service_id'];
}

// ✅ POINT 2 — urgents en premier, puis en_cours, puis numero_file
$sql .= "
    ORDER BY
        r.urgent DESC,
        CASE WHEN r.statut_file = 'en_cours' THEN 0 ELSE 1 END ASC,
        r.date_rdv ASC,
        r.heure_rdv ASC
";

$stmt = $db->prepare($sql);
$stmt->execute($params);
$rdvs = $stmt->fetchAll(PDO::FETCH_ASSOC);

$stats = [
    'en_attente' => 0,
    'confirme'   => 0,
    'paye'       => 0,
    'consomme'   => 0,
    'annule'     => 0,
];
foreach ($rdvs as &$rdv) {
    $rdv['prioritaire']  = (bool) $rdv['prioritaire'];
    $rdv['urgent']       = (int)($rdv['urgent'] ?? 0);
    $rdv['numero_file']  = $rdv['numero_file']  ? (int)$rdv['numero_file']  : null;
    $rdv['plage_id']     = $rdv['plage_id']     ? (int)$rdv['plage_id']     : null;
    $rdv['plage_quota']  = $rdv['plage_quota']  ? (int)$rdv['plage_quota']  : null;
    if (isset($stats[$rdv['statut']])) {
        $stats[$rdv['statut']]++;
    }
}
unset($rdv);

// Récupérer les services pour le select (directeur : tous les services de ses hôpitaux)
$services = [];
if ($userConnecte['role'] === 'directeur_regional') {
    $stmtS = $db->prepare("
        SELECT s.id AS service_id, s.nom AS service_nom, h.nom AS hopital_nom
        FROM services s
        JOIN hopitaux h ON h.id = s.hopital_id
        WHERE s.hopital_id IN ($placeholders)
        ORDER BY h.nom ASC, s.nom ASC
    ");
    $stmtS->execute($filtreParams);
    $services = $stmtS->fetchAll(PDO::FETCH_ASSOC);
} elseif ($userConnecte['role'] !== 'gerant') {
    $stmtS = $db->prepare("
        SELECT s.id AS service_id, s.nom AS service_nom
        FROM services s
        WHERE s.hopital_id = ?
        ORDER BY s.nom ASC
    ");
    $stmtS->execute([$userConnecte['hopital_id']]);
    $services = $stmtS->fetchAll(PDO::FETCH_ASSOC);
}

repondre([
    'succes'      => true,
    'stats'       => $stats,
    'total'       => count($rdvs),
    'hopital_nom' => $hopital_nom,
    'services'    => $services ?: ($userConnecte['services'] ?? []),
    'rdvs'        => $rdvs,
]);