<?php

/**
 * Menu principal de gestion des PDE [F100]
 */
function gestionPDE(): void
{
    global $tabPDE;
    do {
        echo "\n--- Gestion des PDE [F100] ---\n";
        echo "1. Afficher la liste des PDE [F110]\n";
        echo "2. Ajouter un PDE [F120]\n";
        echo "3. Supprimer un PDE [F130]\n";
        echo "4. Activer / désactiver un PDE [F140]\n";
        echo "0. Retour au menu principal\n";

        $choix = readline("Votre choix : ");

        switch ($choix) {
            case '1':
                afficherMenuListePDE(); // F110
                break;
            case '2':
                ajouterPDE(); // F120
                break;
            case '3':
                supprimerPDE(); // F130
                break;
            case '4':
                afficherMenuActivationPDE(); // F140
                break;
            case '0':
                return;
            default:
                echo "Choix invalide, veuillez recommencer.\n";
        }
    } while (true);
}

/**
 * Sous-menu : Afficher la liste des PDE [F110]
 */
function afficherMenuListePDE(): void
{
    do {
        echo "\n--- Afficher la liste des PDE [F110] ---\n";
        echo "1. Afficher tous les PDE [F111]\n";
        echo "2. Afficher les PDE non actifs [F112]\n";
        echo "0. Retour\n";

        $choix = readline("Votre choix : ");

        switch ($choix) {
            case '1':
                afficherTousLesPDE(); // [F111]
                break;
            case '2':
                afficherPDENonActifs(); // [F112]
                break;
            case '0':
                return;
            default:
                echo "Choix invalide.\n";
        }
    } while (true);
}

/**
 * Afficher tous les PDE [F111]
 */
function afficherTousLesPDE(): void
{
    global $tabPDE;

    echo "\n=== Liste de tous les PDE ===\n\n";

    // En-tête du tableau
    printf("%-5s | %-20s | %-20s | %-12s | %-15s | %-10s\n",
        "ID", "Localisation", "Région", "Capacité", "Consommation", "Statut");
    echo str_repeat("-", 95) . "\n";

    // Affichage de chaque PDE
    foreach ($tabPDE as $pde) {
        $statut = isset($pde['actif']) && $pde['actif'] ? "Actif" : "Inactif";
        printf("%-5d | %-20s | %-20s | %-12d | %-15d | %-10s\n",
            $pde['id'],
            $pde['localisation'],
            $pde['region'],
            $pde['capacite'],
            $pde['consommation'],
            $statut
        );
    }

    echo "\nTotal : " . count($tabPDE) . " PDE(s)\n";
    echo "\nAppuyez sur Entrée pour continuer...";
    readline();
}

/**
 * Afficher les PDE non actifs [F112]
 */
function afficherPDENonActifs(): void
{
    global $tabPDE;

    echo "\n=== Liste des PDE non actifs ===\n\n";

    // Filtrer les PDE non actifs
    $pdeNonActifs = array_filter($tabPDE, function($pde) {
        return !isset($pde['actif']) || $pde['actif'] === false;
    });

    if (empty($pdeNonActifs)) {
        echo "Aucun PDE non actif trouvé.\n";
    } else {
        // En-tête du tableau
        printf("%-5s | %-20s | %-20s | %-12s | %-15s\n",
            "ID", "Localisation", "Région", "Capacité", "Consommation");
        echo str_repeat("-", 80) . "\n";

        // Affichage de chaque PDE non actif
        foreach ($pdeNonActifs as $pde) {
            printf("%-5d | %-20s | %-20s | %-12d | %-15d\n",
                $pde['id'],
                $pde['localisation'],
                $pde['region'],
                $pde['capacite'],
                $pde['consommation']
            );
        }

        echo "\nTotal : " . count($pdeNonActifs) . " PDE(s) non actif(s)\n";
    }

    echo "\nAppuyez sur Entrée pour continuer...";
    readline();
}

/**
 * Action : Ajouter un PDE [F120]
 */
function ajouterPDE(): void
{
    global $tabPDE;

    echo "\n=== Ajouter un PDE [F120] ===\n\n";

    // Générer un nouvel ID (le plus grand ID + 1)
    $nouvelId = 1;
    foreach ($tabPDE as $pde) {
        if ($pde['id'] >= $nouvelId) {
            $nouvelId = $pde['id'] + 1;
        }
    }

    // Saisie de la localisation
    $localisation = readline("Localisation : ");
    if (empty(trim($localisation))) {
        echo "Erreur : La localisation ne peut pas être vide.\n";
        return;
    }

    // Saisie de la région
    $region = readline("Région : ");
    if (empty(trim($region))) {
        echo "Erreur : La région ne peut pas être vide.\n";
        return;
    }

    // Saisie de la capacité
    $capacite = readline("Capacité (en unités) : ");
    if (!is_numeric($capacite) || $capacite <= 0) {
        echo "Erreur : La capacité doit être un nombre positif.\n";
        return;
    }
    $capacite = (int)$capacite;

    // Saisie de la consommation
    $consommation = readline("Consommation initiale : ");
    if (!is_numeric($consommation) || $consommation < 0) {
        echo "Erreur : La consommation doit être un nombre positif ou zéro.\n";
        return;
    }
    $consommation = (int)$consommation;

    // Vérifier que la consommation ne dépasse pas la capacité
    if ($consommation > $capacite) {
        echo "Erreur : La consommation ne peut pas dépasser la capacité.\n";
        return;
    }

    // Le PDE est actif par défaut
    $actif = true;

    // Créer le nouveau PDE
    $nouveauPDE = [
        'id' => $nouvelId,
        'localisation' => $localisation,
        'region' => $region,
        'capacite' => $capacite,
        'consommation' => $consommation,
        'actif' => $actif
    ];

    // Ajouter au tableau
    $tabPDE[] = $nouveauPDE;

    echo "\nPDE ajouté avec succès !\n";
    echo "ID : $nouvelId\n";
    echo "Localisation : $localisation\n";
    echo "Région : $region\n";
    echo "Capacité : $capacite\n";
    echo "Consommation : $consommation\n";
    echo "Statut : Actif\n";

    echo "\nAppuyez sur Entrée pour continuer...";
    readline();
}

/**
 * Action : Supprimer un PDE [F130]
 */
function supprimerPDE(): void
{
    global $tabPDE;

    echo "\n=== Supprimer un PDE [F130] ===\n\n";

    // Vérifier qu'il y a des PDE
    if (empty($tabPDE)) {
        echo "Aucun PDE disponible.\n";
        echo "\nAppuyez sur Entrée pour continuer...";
        readline();
        return;
    }

    // Afficher la liste des PDE disponibles
    echo "Liste des PDE disponibles :\n\n";
    printf("%-5s | %-20s | %-20s | %-10s\n",
        "ID", "Localisation", "Région", "Statut");
    echo str_repeat("-", 65) . "\n";

    foreach ($tabPDE as $pde) {
        $statut = $pde['actif'] ? "Actif" : "Inactif";
        printf("%-5d | %-20s | %-20s | %-10s\n",
            $pde['id'],
            $pde['localisation'],
            $pde['region'],
            $statut
        );
    }

    echo "\n";
    $idASupprimer = readline("Entrez l'ID du PDE à supprimer (0 pour annuler) : ");

    // Annulation
    if ($idASupprimer == 0) {
        echo "Suppression annulée.\n";
        return;
    }

    // Vérifier que l'ID est un nombre
    if (!is_numeric($idASupprimer)) {
        echo "Erreur : L'ID doit être un nombre.\n";
        echo "\nAppuyez sur Entrée pour continuer...";
        readline();
        return;
    }

    $idASupprimer = (int)$idASupprimer;

    // Chercher le PDE avec cet ID
    $indexTrouve = -1;
    $pdeTrouve = null;

    foreach ($tabPDE as $index => $pde) {
        if ($pde['id'] == $idASupprimer) {
            $indexTrouve = $index;
            $pdeTrouve = $pde;
            break;
        }
    }

    // Si PDE non trouvé
    if ($indexTrouve == -1) {
        echo "Erreur : Aucun PDE trouvé avec l'ID $idASupprimer.\n";
        echo "\nAppuyez sur Entrée pour continuer...";
        readline();
        return;
    }

    // Confirmation de suppression
    echo "\nPDE à supprimer :\n";
    echo "ID : " . $pdeTrouve['id'] . "\n";
    echo "Localisation : " . $pdeTrouve['localisation'] . "\n";
    echo "Région : " . $pdeTrouve['region'] . "\n";

    $confirmation = readline("\nÊtes-vous sûr de vouloir supprimer ce PDE ? (o/n) : ");

    if (strtolower($confirmation) == 'o' || strtolower($confirmation) == 'oui') {
        // Supprimer le PDE
        array_splice($tabPDE, $indexTrouve, 1);

        echo "\nPDE supprimé avec succès !\n";
    } else {
        echo "\nSuppression annulée.\n";
    }

    echo "\nAppuyez sur Entrée pour continuer...";
    readline();
}

/**
 * Sous-menu : Activer / désactiver un PDE [F140]
 */
function afficherMenuActivationPDE(): void
{
    do {
        echo "\n--- Activer / désactiver un PDE [F140] ---\n";
        echo "1. Activer un PDE [F141]\n";
        echo "2. Désactiver un PDE [F142]\n";
        echo "0. Retour\n";

        $choix = readline("Votre choix : ");

        switch ($choix) {
            case '1':
                activerPDE(); // [F141]
                break;
            case '2':
                desactiverPDE(); // [F142]
                break;
            case '0':
                return;
            default:
                echo "Choix invalide.\n";
        }
    } while (true);
}

/**
 * Activer un PDE [F141]
 */
function activerPDE(): void
{
    global $tabPDE;

    echo "\n=== Activer un PDE [F141] ===\n\n";

    // Filtrer les PDE non actifs
    $pdeNonActifs = [];
    foreach ($tabPDE as $index => $pde) {
        if (!$pde['actif']) {
            $pdeNonActifs[$index] = $pde;
        }
    }

    // Vérifier qu'il y a des PDE non actifs
    if (empty($pdeNonActifs)) {
        echo "Tous les PDE sont déjà actifs.\n";
        echo "\nAppuyez sur Entrée pour continuer...";
        readline();
        return;
    }

    // Afficher la liste des PDE non actifs
    echo "Liste des PDE non actifs :\n\n";
    printf("%-5s | %-20s | %-20s | %-12s | %-15s\n",
        "ID", "Localisation", "Région", "Capacité", "Consommation");
    echo str_repeat("-", 80) . "\n";

    foreach ($pdeNonActifs as $pde) {
        printf("%-5d | %-20s | %-20s | %-12d | %-15d\n",
            $pde['id'],
            $pde['localisation'],
            $pde['region'],
            $pde['capacite'],
            $pde['consommation']
        );
    }

    echo "\n";
    $idAActiver = readline("Entrez l'ID du PDE à activer (0 pour annuler) : ");

    // Annulation
    if ($idAActiver == 0) {
        echo "Activation annulée.\n";
        return;
    }

    // Vérifier que l'ID est un nombre
    if (!is_numeric($idAActiver)) {
        echo "Erreur : L'ID doit être un nombre.\n";
        echo "\nAppuyez sur Entrée pour continuer...";
        readline();
        return;
    }

    $idAActiver = (int)$idAActiver;

    // Chercher le PDE avec cet ID
    $indexTrouve = -1;

    foreach ($tabPDE as $index => $pde) {
        if ($pde['id'] == $idAActiver) {
            $indexTrouve = $index;
            break;
        }
    }

    // Si PDE non trouvé
    if ($indexTrouve == -1) {
        echo "Erreur : Aucun PDE trouvé avec l'ID $idAActiver.\n";
        echo "\nAppuyez sur Entrée pour continuer...";
        readline();
        return;
    }

    // Vérifier que le PDE n'est pas déjà actif
    if ($tabPDE[$indexTrouve]['actif']) {
        echo "Ce PDE est déjà actif.\n";
        echo "\nAppuyez sur Entrée pour continuer...";
        readline();
        return;
    }

    // Activer le PDE
    $tabPDE[$indexTrouve]['actif'] = true;

    echo "\nPDE activé avec succès !\n";
    echo "Localisation : " . $tabPDE[$indexTrouve]['localisation'] . "\n";
    echo "Région : " . $tabPDE[$indexTrouve]['region'] . "\n";

    echo "\nAppuyez sur Entrée pour continuer...";
    readline();
}

/**
 * Désactiver un PDE [F142]
 */
function desactiverPDE(): void
{
    global $tabPDE;

    echo "\n=== Désactiver un PDE [F142] ===\n\n";

    // Filtrer les PDE actifs
    $pdeActifs = [];
    foreach ($tabPDE as $index => $pde) {
        if ($pde['actif']) {
            $pdeActifs[$index] = $pde;
        }
    }

    // Vérifier qu'il y a des PDE actifs
    if (empty($pdeActifs)) {
        echo "Tous les PDE sont déjà désactivés.\n";
        echo "\nAppuyez sur Entrée pour continuer...";
        readline();
        return;
    }

    // Afficher la liste des PDE actifs
    echo "Liste des PDE actifs :\n\n";
    printf("%-5s | %-20s | %-20s | %-12s | %-15s\n",
        "ID", "Localisation", "Région", "Capacité", "Consommation");
    echo str_repeat("-", 80) . "\n";

    foreach ($pdeActifs as $pde) {
        printf("%-5d | %-20s | %-20s | %-12d | %-15d\n",
            $pde['id'],
            $pde['localisation'],
            $pde['region'],
            $pde['capacite'],
            $pde['consommation']
        );
    }

    echo "\n";
    $idADesactiver = readline("Entrez l'ID du PDE à désactiver (0 pour annuler) : ");

    // Annulation
    if ($idADesactiver == 0) {
        echo "Désactivation annulée.\n";
        return;
    }

    // Vérifier que l'ID est un nombre
    if (!is_numeric($idADesactiver)) {
        echo "Erreur : L'ID doit être un nombre.\n";
        echo "\nAppuyez sur Entrée pour continuer...";
        readline();
        return;
    }

    $idADesactiver = (int)$idADesactiver;

    // Chercher le PDE avec cet ID
    $indexTrouve = -1;

    foreach ($tabPDE as $index => $pde) {
        if ($pde['id'] == $idADesactiver) {
            $indexTrouve = $index;
            break;
        }
    }

    // Si PDE non trouvé
    if ($indexTrouve == -1) {
        echo "Erreur : Aucun PDE trouvé avec l'ID $idADesactiver.\n";
        echo "\nAppuyez sur Entrée pour continuer...";
        readline();
        return;
    }

    // Vérifier que le PDE n'est pas déjà inactif
    if (!$tabPDE[$indexTrouve]['actif']) {
        echo "Ce PDE est déjà désactivé.\n";
        echo "\nAppuyez sur Entrée pour continuer...";
        readline();
        return;
    }

    // Confirmation de désactivation
    echo "\nPDE à désactiver :\n";
    echo "Localisation : " . $tabPDE[$indexTrouve]['localisation'] . "\n";
    echo "Région : " . $tabPDE[$indexTrouve]['region'] . "\n";

    $confirmation = readline("\nÊtes-vous sûr de vouloir désactiver ce PDE ? (o/n) : ");

    if (strtolower($confirmation) == 'o' || strtolower($confirmation) == 'oui') {
        // Désactiver le PDE
        $tabPDE[$indexTrouve]['actif'] = false;

        echo "\nPDE désactivé avec succès !\n";
    } else {
        echo "\nDésactivation annulée.\n";
    }

    echo "\nAppuyez sur Entrée pour continuer...";
    readline();
}