<?php
// ============================================
// SEN RDV SANTÉ+ — CRUD Directeurs régionaux
// GET    /api/admin/directeurs.php              → liste des directeurs
// POST   /api/admin/directeurs.php              → créer un directeur
// PUT    /api/admin/directeurs.php              → modifier assignations
// DELETE /api/admin/directeurs.php?id=X         → supprimer
// Headers: Authorization: Bearer {token super_admin}
// ============================================
require_once '../config/helpers.php';
require_once '../config/database.php';

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

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

// ════════════════════════════════════
// GET — Liste des directeurs régionaux
// ════════════════════════════════════
if ($method === 'GET') {
    $stmt = $db->prepare("
        SELECT u.id, u.nom, u.prenom, u.telephone, u.actif,
               GROUP_CONCAT(DISTINCT h.nom SEPARATOR ', ') AS hopitaux_noms,
               COUNT(dh.hopital_id) AS nb_hopitaux
        FROM utilisateurs u
        LEFT JOIN directeur_hopitaux dh ON dh.directeur_id = u.id
        LEFT JOIN hopitaux h ON h.id = dh.hopital_id
        WHERE u.role = 'directeur_regional'
        GROUP BY u.id
        ORDER BY u.nom ASC
    ");
    $stmt->execute();
    $directeurs = $stmt->fetchAll(PDO::FETCH_ASSOC);

    // Pour chaque directeur, récupérer la liste complète des IDs hopitaux
    foreach ($directeurs as &$d) {
        $stmtH = $db->prepare("
            SELECT hopital_id FROM directeur_hopitaux WHERE directeur_id = ?
        ");
        $stmtH->execute([$d['id']]);
        $d['hopitaux_ids'] = $stmtH->fetchAll(PDO::FETCH_COLUMN);
    }
    unset($d);

    // Liste de tous les hôpitaux pour le formulaire
    $stmtHop = $db->prepare("SELECT id, nom, ville FROM hopitaux ORDER BY nom ASC");
    $stmtHop->execute();
    $hopitaux = $stmtHop->fetchAll(PDO::FETCH_ASSOC);

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

// ════════════════════════════════════
// POST — Créer un directeur régional
// ════════════════════════════════════
if ($method === 'POST') {
    $body = getBody();
    validerChamps($body, ['nom', 'prenom', 'telephone', 'mot_de_passe']);

    // Vérifier si le téléphone existe déjà
    $stmtCheck = $db->prepare("SELECT id FROM utilisateurs WHERE telephone = ?");
    $stmtCheck->execute([$body['telephone']]);
    if ($stmtCheck->fetch()) {
        repondre(['erreur' => 'Ce numéro de téléphone est déjà utilisé'], 409);
    }

    $motDePasseHash = password_hash($body['mot_de_passe'], PASSWORD_BCRYPT);
    $role = 'directeur_regional';

    $stmt = $db->prepare("
        INSERT INTO utilisateurs (nom, prenom, telephone, role, mot_de_passe, actif)
        VALUES (?, ?, ?, ?, ?, 1)
    ");
    $stmt->execute([
        trim($body['nom']),
        trim($body['prenom']),
        trim($body['telephone']),
        $role,
        $motDePasseHash,
    ]);

    $directeurId = $db->lastInsertId();

    if (!$directeurId) {
        repondre(['erreur' => 'Erreur lors de la création du directeur'], 500);
    }

    // Assigner les hôpitaux
    if (!empty($body['hopitaux_ids']) && is_array($body['hopitaux_ids'])) {
        $stmtInsert = $db->prepare("
            INSERT IGNORE INTO directeur_hopitaux (directeur_id, hopital_id)
            VALUES (?, ?)
        ");
        foreach ($body['hopitaux_ids'] as $hopitalId) {
            $stmtInsert->execute([$directeurId, (int)$hopitalId]);
        }
    }

    repondre([
        'succes'      => true,
        'message'     => 'Directeur régional créé avec succès',
        'directeur_id'=> $directeurId,
    ], 201);
}

// ════════════════════════════════════
// PUT — Modifier un directeur
// ════════════════════════════════════
if ($method === 'PUT') {
    $body = getBody();
    validerChamps($body, ['id']);

    $directeurId = (int)$body['id'];

    // Vérifier que l'utilisateur existe et est bien un directeur
    $stmtCheck = $db->prepare("SELECT id FROM utilisateurs WHERE id = ? AND role = 'directeur_regional'");
    $stmtCheck->execute([$directeurId]);
    if (!$stmtCheck->fetch()) {
        repondre(['erreur' => 'Directeur introuvable'], 404);
    }

    // Mise à jour des infos de base
    if (!empty($body['nom']) || !empty($body['prenom']) || !empty($body['telephone'])) {
        $sql = "UPDATE utilisateurs SET ";
        $parts = [];
        $params = [];

        if (!empty($body['nom'])) {
            $parts[] = "nom = ?";
            $params[] = trim($body['nom']);
        }
        if (!empty($body['prenom'])) {
            $parts[] = "prenom = ?";
            $params[] = trim($body['prenom']);
        }
        if (!empty($body['telephone'])) {
            $parts[] = "telephone = ?";
            $params[] = trim($body['telephone']);
        }
        if (!empty($body['mot_de_passe'])) {
            $parts[] = "mot_de_passe = ?";
            $params[] = password_hash($body['mot_de_passe'], PASSWORD_BCRYPT);
        }
        if (isset($body['actif'])) {
            $parts[] = "actif = ?";
            $params[] = (int)$body['actif'];
        }

        if (!empty($parts)) {
            $params[] = $directeurId;
            $db->prepare($sql . implode(', ', $parts) . " WHERE id = ?")->execute($params);
        }
    }

    // Mise à jour des assignations d'hôpitaux
    if (isset($body['hopitaux_ids']) && is_array($body['hopitaux_ids'])) {
        // Supprimer toutes les assignations existantes
        $db->prepare("DELETE FROM directeur_hopitaux WHERE directeur_id = ?")->execute([$directeurId]);

        // Réinsérer les nouvelles
        $stmtInsert = $db->prepare("
            INSERT IGNORE INTO directeur_hopitaux (directeur_id, hopital_id)
            VALUES (?, ?)
        ");
        foreach ($body['hopitaux_ids'] as $hopitalId) {
            $stmtInsert->execute([$directeurId, (int)$hopitalId]);
        }
    }

    repondre([
        'succes'  => true,
        'message' => 'Directeur mis à jour',
    ]);
}

// ════════════════════════════════════
// DELETE — Supprimer un directeur
// ════════════════════════════════════
if ($method === 'DELETE') {
    $id = $_GET['id'] ?? null;
    if (!$id) repondre(['erreur' => 'id obligatoire'], 422);

    $db->prepare("DELETE FROM directeur_hopitaux WHERE directeur_id = ?")->execute([$id]);
    $db->prepare("UPDATE utilisateurs SET actif = 0 WHERE id = ? AND role = 'directeur_regional'")->execute([$id]);

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

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