#include "systeme.h"

#include <QDebug>


Systeme::Systeme() : QObject()
{
}



//================================================================================================================================
//  Fonction :  Lit le contenu d'un fichier texte et le retourne
//  Reçoit   :  Le nom du fichier
//  Retour   :  Une ligne "Ok" ou "Nok" représentant le résultat de la lecture puis la liste des lignes lues dans le fichier.
//================================================================================================================================
QStringList Systeme::lecture_fichier(QString fichier)
{
QStringList retour;

    QFile file(fichier);                                    // Appel du constructeur de la classe QFile

    if (file.open(QIODevice::ReadOnly | QIODevice::Text))   // Si l'ouverture du fichier en lecture à réussie
    {
//qDebug() << "Ouverture du fichier [" << fichier << "] en lecture effectué avec succès !";
        retour << "Ok";

        QTextStream entree(&file);

        while(!entree.atEnd())                              // Boucle sur toutes les lignes du fichier (attention, il y en a toujours une de plus à la fin...)
        {
            QString ligne = entree.readLine();              // Lecture de la ligne
            retour << ligne;                                // Ajout à la structure de retour
//qDebug() << "Ligne lue dans le fichier : " << ligne;
        }

        file.close();                                       // Fermeture du fichier
    }
    else
    {
        qDebug() << "Erreur d'ouverture du fichier [" << fichier << "]. La lecture est abandonnée...";
        retour << "Nok";
    }

    return(retour);
}



//================================================================================================================================
//  Fonction :  Lit le contenu d'un fichier texte et le retourne
//  Reçoit   :  Le nom du fichier
//  Retour   :  0 si Ok, -1 si Nok
//================================================================================================================================
qint8 Systeme::ecriture_fichier(QString fichier, QStringList lignes)
{
    QFile file(fichier);                                    // Appel du constructeur de la classe QFile

    if (file.open(QIODevice::WriteOnly | QIODevice::Text))   // Si l'ouverture du fichier en écriture à réussie
    {
//qDebug() << "Ouverture du fichier [" << fichier << "] en écriture effectué avec succès !";

        QTextStream sortie(&file);

        for ( const auto& ligne : lignes )
        {
            sortie << ligne << "\n";
//qDebug() << "Ligne écrite dans le fichier : " << ligne;
        }

        file.close();                                       // Fermeture du fichier
        return(0);
    }
    else
    {
        qDebug() << "Erreur d'ouverture du fichier [" << fichier << "]. L'écriture est abandonnée...";
        return(-1);
    }
}




//===================================================================================================
// Fonction :   Exécute la commande shelle reçue, attend la fin d'exécution et renvoi la réponse de
//              la commande.
// Reçoit   :   la chaine de la commande
// Renvoit  :   La chaine de retour de la commande
//===================================================================================================
QString Systeme::commande_shell(QString commande, QString fichier_sortie)
{

//qDebug() << "Commande shell à lancer = [" << commande << "]";

    QProcess process;

    // Mise en place du fichier de sortie :
    // ATTENTION : l'utilisation d'une redirection du type ' > fichier_sortie' ne fonctionne PAS avec QProcess...
    if (fichier_sortie != "") process.setStandardOutputFile(fichier_sortie);

    // Lancement de la commande :
//    process.start(commande);
// Modif de 08/2026 lors du passage à Qt6 sur CM5 : l'appel direct ne fonctionnait pas avec certaines commandes précédée de sudo.
// Le version ci-dessous fait le découpage <commande><argument>...<argument> avant d'appeler la fonction de start avec le découpage déjà fait.
// Résoud le problème mais sans savoir exactement ce qui bloquait dans la commande précédente...
    QStringList args = QProcess::splitCommand(commande);
    QString programme = args.takeFirst();
    process.start(programme, args);

    // Attente de la fin d'exécution :
    // ATTENTION : on bloque l'éxécution jusqu'à la fin de la commande...!
    process.waitForFinished();

//qDebug() << "QProcess error() =" << process.error();
//qDebug() << "QProcess exitCode() =" << process.exitCode();
//qDebug() << "QProcess exitStatus() =" << process.exitStatus();

//    QThread::msleep(5);
    QString out(process.readAllStandardOutput());
//    qDebug()<<"Sortie standard = "<<out;
    QString err(process.readAllStandardError());
    if (!err.isEmpty()) qDebug() << "Erreur commande shell [" << commande << "] : " << err;
//qDebug() << "Commande shell [" << commande << "] terminée";

    return(out);
}

//===================================================================================================
// Fonction :   Exécute la commande shelle reçue et retourne à la fonction appelante sans attendre
//              la fin d'exécution.
// Reçoit   :   la chaine de la commande
// Renvoit  :   Rien
//===================================================================================================
void Systeme::commande_shell_non_bloquante(QString commande)
{

//qDebug() << "Commande shell à lancer = [" << commande << "]";

    QProcess process;

    // Lancement de la commande :
    process.startDetached(commande);        // Permer d'oublier le processus une fois lancé (sinon, on peut générer une erreur du type "QProcess: Destroyed while process ("sudo") is still running.")
}
