<?php
// ============================================
// SEN RDV SANTÉ+ — Gestion du staff
// Super Admin : CRUD sur tout le staff de tous les hôpitaux
// Admin Hôpital : CRUD sur le staff de son hôpital uniquement
// Directeur Régional : lecture seule sur ses hôpitaux
// ============================================

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 non autorisé'], 403);
}

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

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

// ---- GET : liste du staff ----
if ($method === 'GET') {
    if ($isSuperAdmin) {
        $stmt = $db->prepare("
            SELECT u.id, u.nom, u.prenom, u.telephone, u.email, u.role, u.actif,
                   h.id AS hopital_id, h.nom AS hopital_nom
            FROM utilisateurs u
            LEFT JOIN hopitaux h ON h.id = u.hopital_id
            WHERE u.role IN ('gerant', 'admin_hopital')
            ORDER BY h.nom ASC, u.role ASC, u.nom ASC
        ");
        $stmt->execute();
    } elseif ($isDirecteur) {
        // Récupérer les 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)) {
            repondre(['succes' => true, 'staff' => []]);
        }
        
        $hopitalId = $_GET['hopital_id'] ?? null;
        
        if ($hopitalId && in_array((int)$hopitalId, $hopitauxIds)) {
            // Filtrer par un hôpital spécifique
            $stmt = $db->prepare("
                SELECT u.id, u.nom, u.prenom, u.telephone, u.email, u.role, u.actif,
                       h.id AS hopital_id, h.nom AS hopital_nom
                FROM utilisateurs u
                LEFT JOIN hopitaux h ON h.id = u.hopital_id
                WHERE u.hopital_id = ? AND u.role IN ('gerant', 'admin_hopital')
                ORDER BY u.role ASC, u.nom ASC
            ");
            $stmt->execute([$hopitalId]);
        } else {
            // Tous les hôpitaux du directeur
            $placeholders = implode(',', array_fill(0, count($hopitauxIds), '?'));
            $stmt = $db->prepare("
                SELECT u.id, u.nom, u.prenom, u.telephone, u.email, u.role, u.actif,
                       h.id AS hopital_id, h.nom AS hopital_nom
                FROM utilisateurs u
                LEFT JOIN hopitaux h ON h.id = u.hopital_id
                WHERE u.hopital_id IN ($placeholders) AND u.role IN ('gerant', 'admin_hopital')
                ORDER BY h.nom ASC, u.role ASC, u.nom ASC
            ");
            $stmt->execute($hopitauxIds);
        }
    } else {
        $stmt = $db->prepare("
            SELECT u.id, u.nom, u.prenom, u.telephone, u.email, u.role, u.actif,
                   h.nom AS hopital_nom
            FROM utilisateurs u
            LEFT JOIN hopitaux h ON h.id = u.hopital_id
            WHERE u.hopital_id = ? AND u.role IN ('gerant', 'admin_hopital')
            ORDER BY u.role ASC, u.nom ASC
        ");
        $stmt->execute([$monHopitalId]);
    }

    $staff = $stmt->fetchAll(PDO::FETCH_ASSOC);

    // j'enrichis chaque gérant avec la liste de ses services
    foreach ($staff as &$membre) {
        $membre['services'] = [];
        if ($membre['role'] === 'gerant') {
            $stmt2 = $db->prepare("
                SELECT gs.service_id, s.nom AS service_nom
                FROM gerant_services gs
                JOIN services s ON s.id = gs.service_id
                WHERE gs.gerant_id = ?
            ");
            $stmt2->execute([$membre['id']]);
            $membre['services'] = $stmt2->fetchAll(PDO::FETCH_ASSOC);
        }
    }
    unset($membre);

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

// ---- POST : créer un compte gérant/admin ----
if ($method === 'POST') {
    $body = getBody();
    validerChamps($body, ['nom', 'prenom', 'telephone', 'role', 'mot_de_passe']);

    if (!in_array($body['role'], ['gerant', 'admin_hopital'])) {
        repondre(['erreur' => 'Rôle invalide'], 422);
    }

    $hopitalId = $isSuperAdmin
        ? ($body['hopital_id'] ?? null)
        : $monHopitalId;

    if (!$hopitalId) {
        repondre(['erreur' => 'hopital_id obligatoire'], 422);
    }

    if ($body['role'] === 'gerant') {
        $serviceIds = $body['service_ids'] ?? [];
        if (empty($serviceIds) || !is_array($serviceIds)) {
            repondre(['erreur' => 'Un gérant doit être rattaché à au moins un service'], 422);
        }
    }

    if (!$isSuperAdmin && $hopitalId != $monHopitalId) {
        repondre(['erreur' => 'Vous ne pouvez créer du staff que pour votre hôpital'], 403);
    }

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

    $stmt = $db->prepare("
        INSERT INTO utilisateurs (hopital_id, nom, prenom, telephone, email, mot_de_passe, role)
        VALUES (?, ?, ?, ?, ?, ?, ?)
    ");
    $stmt->execute([
        $hopitalId,
        trim($body['nom']),
        trim($body['prenom']),
        $body['telephone'],
        $body['email'] ?? null,
        hash('sha256', $body['mot_de_passe']),
        $body['role']
    ]);

    $newId = $db->lastInsertId();

    if ($body['role'] === 'gerant') {
        $stmtGs = $db->prepare("
            INSERT IGNORE INTO gerant_services (gerant_id, service_id) VALUES (?, ?)
        ");
        foreach ($serviceIds as $sid) {
            $stmtGs->execute([$newId, (int)$sid]);
        }
    }

    repondre([
        'succes'  => true,
        'message' => 'Compte créé avec succès',
        'id'      => $newId
    ], 201);
}

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

    $stmt = $db->prepare("SELECT hopital_id, role FROM utilisateurs WHERE id = ?");
    $stmt->execute([$body['id']]);
    $cible = $stmt->fetch(PDO::FETCH_ASSOC);

    if (!$cible) {
        repondre(['erreur' => 'Utilisateur introuvable'], 404);
    }

    if (!$isSuperAdmin && $cible['hopital_id'] != $monHopitalId) {
        repondre(['erreur' => 'Vous ne pouvez modifier que le staff de votre hôpital'], 403);
    }

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

    if (!empty($body['nom']))       { $champs[] = 'nom = ?';       $params[] = trim($body['nom']); }
    if (!empty($body['prenom']))    { $champs[] = 'prenom = ?';    $params[] = trim($body['prenom']); }
    if (!empty($body['telephone'])) { $champs[] = 'telephone = ?'; $params[] = $body['telephone']; }
    if (!empty($body['email']))     { $champs[] = 'email = ?';     $params[] = $body['email']; }
    if (isset($body['actif']))      { $champs[] = 'actif = ?';     $params[] = $body['actif'] ? 1 : 0; }
    if ($isSuperAdmin && !empty($body['hopital_id'])) {
        $champs[] = 'hopital_id = ?';
        $params[] = $body['hopital_id'];
    }
    if (!empty($body['mot_de_passe'])) {
        $champs[] = 'mot_de_passe = ?';
        $params[] = hash('sha256', $body['mot_de_passe']);
    }

    if (!empty($champs)) {
        $params[] = $body['id'];
        $stmt = $db->prepare("UPDATE utilisateurs SET " . implode(', ', $champs) . " WHERE id = ?");
        $stmt->execute($params);
    }

    if ($cible['role'] === 'gerant' && isset($body['service_ids']) && is_array($body['service_ids'])) {
        if (empty($body['service_ids'])) {
            repondre(['erreur' => 'Un gérant doit garder au moins un service'], 422);
        }
        $stmt = $db->prepare("DELETE FROM gerant_services WHERE gerant_id = ?");
        $stmt->execute([$body['id']]);

        $stmtGs = $db->prepare("INSERT IGNORE INTO gerant_services (gerant_id, service_id) VALUES (?, ?)");
        foreach ($body['service_ids'] as $sid) {
            $stmtGs->execute([$body['id'], (int)$sid]);
        }
    }

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

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

    $stmt = $db->prepare("SELECT hopital_id FROM utilisateurs WHERE id = ?");
    $stmt->execute([$_GET['id']]);
    $cible = $stmt->fetch(PDO::FETCH_ASSOC);

    if (!$cible) {
        repondre(['erreur' => 'Utilisateur introuvable'], 404);
    }

    if (!$isSuperAdmin && $cible['hopital_id'] != $monHopitalId) {
        repondre(['erreur' => 'Vous ne pouvez désactiver que le staff de votre hôpital'], 403);
    }

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

    $stmt = $db->prepare("DELETE FROM tokens_api WHERE utilisateur_id = ?");
    $stmt->execute([$_GET['id']]);

    repondre(['succes' => true, 'message' => 'Compte désactivé et sessions révoquées']);
}

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