<?php
// ============================================
// SEN RDV SANTÉ+ — CRUD Hôpitaux (Super Admin)
// GET    /api/admin/hopitaux.php       → liste
// POST   /api/admin/hopitaux.php       → créer
// PUT    /api/admin/hopitaux.php       → modifier
// DELETE /api/admin/hopitaux.php?id=1  → désactiver
// ============================================

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

$userConnecte = verifierToken();

if ($userConnecte['role'] !== 'super_admin') {
    repondre(['erreur' => 'Accès réservé au Super Admin'], 403);
}

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

// ---- GET ----
if ($method === 'GET') {
    $stmt = $db->prepare("
        SELECT h.id, h.nom, h.adresse, h.telephone, h.email, h.type, h.actif,
               h.ville, h.region,
               COUNT(DISTINCT s.id) AS nb_services
        FROM hopitaux h
        LEFT JOIN services s ON s.hopital_id = h.id AND s.actif = 1
        GROUP BY h.id
        ORDER BY h.nom ASC
    ");
    $stmt->execute();
    repondre(['succes' => true, 'hopitaux' => $stmt->fetchAll(PDO::FETCH_ASSOC)]);
}

// ── helper : résoudre ville_id depuis le nom de région ──
function resolverVilleId($db, $region) {
    // je cherche la ville chef-lieu de cette région
    $stmt = $db->prepare("
        SELECT v.id FROM villes v
        JOIN regions r ON r.id = v.region_id
        WHERE r.nom = ? OR v.nom = ?
        LIMIT 1
    ");
    $stmt->execute([$region, $region]);
    $row = $stmt->fetch(PDO::FETCH_ASSOC);
    if ($row) return (int)$row['id'];
    // fallback : Dakar
    $stmt = $db->prepare("SELECT id FROM villes WHERE nom = 'Dakar' LIMIT 1");
    $stmt->execute();
    $row = $stmt->fetch(PDO::FETCH_ASSOC);
    return $row ? (int)$row['id'] : 1;
}

// ---- POST : créer un hôpital ----
if ($method === 'POST') {
    $body = getBody();
    validerChamps($body, ['nom', 'region', 'type']);

    // je vérifie qu'un hôpital avec ce nom n'existe pas déjà
    $stmt = $db->prepare("SELECT id FROM hopitaux WHERE nom = ?");
    $stmt->execute([trim($body['nom'])]);
    if ($stmt->fetch()) {
        repondre(['erreur' => 'Un hôpital avec ce nom existe déjà'], 409);
    }

    $villeId = resolverVilleId($db, $body['region']);

    $stmt = $db->prepare("
        INSERT INTO hopitaux (ville_id, nom, ville, region, adresse, telephone, email, type)
        VALUES (?, ?, ?, ?, ?, ?, ?, ?)
    ");
    $stmt->execute([
        $villeId,
        trim($body['nom']),
        trim($body['ville'] ?? $body['region']),
        trim($body['region']),
        $body['adresse']   ?? null,
        $body['telephone'] ?? null,
        $body['email']     ?? null,
        $body['type'],
    ]);

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

// ---- PUT : modifier un hôpital ----
if ($method === 'PUT') {
    $body = getBody();
    validerChamps($body, ['id']);

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

    if (!empty($body['nom']))       { $champs[] = 'nom = ?';       $params[] = trim($body['nom']); }
    if (!empty($body['ville']))     { $champs[] = 'ville = ?';     $params[] = trim($body['ville']); }
    if (!empty($body['region']))    { $champs[] = 'region = ?';    $params[] = trim($body['region']); }
    if (!empty($body['type']))      { $champs[] = 'type = ?';      $params[] = $body['type']; }
    if (isset($body['adresse']))    { $champs[] = 'adresse = ?';   $params[] = $body['adresse']; }
    if (isset($body['telephone']))  { $champs[] = 'telephone = ?'; $params[] = $body['telephone']; }
    if (isset($body['email']))      { $champs[] = 'email = ?';     $params[] = $body['email']; }
    if (isset($body['actif']))      { $champs[] = 'actif = ?';     $params[] = $body['actif'] ? 1 : 0; }

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

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

    repondre(['succes' => true, 'message' => 'Hôpital modifié avec succès']);
}

// ---- DELETE : désactiver un hôpital ----
if ($method === 'DELETE') {
    if (empty($_GET['id'])) {
        repondre(['erreur' => 'id obligatoire'], 422);
    }

    // je vérifie qu'il n'y a pas de RDVs actifs avant désactivation
    $stmt = $db->prepare("
        SELECT COUNT(*) AS total FROM rendez_vous r
        JOIN services s ON s.id = r.service_id
        WHERE s.hopital_id = ? AND r.statut IN ('en_attente','confirme','paye')
        AND r.date_rdv >= CURDATE()
    ");
    $stmt->execute([$_GET['id']]);
    $rdvsActifs = $stmt->fetch(PDO::FETCH_ASSOC)['total'];

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

    $stmt = $db->prepare("UPDATE hopitaux SET actif = 0 WHERE id = ?");
    $stmt->execute([$_GET['id']]);

    repondre(['succes' => true, 'message' => 'Hôpital désactivé']);
}

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