#include <qmessagebox.h> // permet de générer des boites de dialogue
#include <qfile.h> 

void FormUsers::init()
{
    ChargeFichiers(); //ouverture du fichier des groupes et chargement dans la liste
}

void FormUsers::SauveFichiers()
{
    groupe * grp; // grp est un pointeur sur les groupes d'utilisateurs
    FILE * fgroup;
    fgroup=fopen("./gshadow.new","w"); //ouverture du fichier en mode écriture
    QTextOStream ficGroup(fgroup);
    int i;
    int total=ListBoxGroups->count();
    for (i=0;i<total;i++)
    {
	grp=(groupe *) ListBoxGroups->item(i);
	ficGroup << grp->text() << ":" << grp->mdp << ":" << grp->ListeAdministrateurs << ":" << grp->users.join(",") << endl;
    }
    fclose(fgroup); // Fermeture du fichier groupe
    QFile file("./gshadow");
    file.setName("./gshadow.bak");
    file.close();
    // QMessageBox::critical(this,"Enregistrement effectué","Les enregistrements ont bien été enregistré !");
    
}

void FormUsers::ChargeFichiers()
{
    all_users.clear();
    ListBoxGroups->clear();
    // Récupération des groupes
    FILE * fgroup;
    fgroup=fopen("./gshadow","r");
    QTextIStream ficGroup(fgroup); //ouverture du fichier en mode lecture
    QString ligneGrp;
    while(!ficGroup.atEnd()) //faire tant que ce n'est pas la fin du fichier
    {
	ficGroup>>ligneGrp; //on récupère une ligne 
	//split
	//ajout du groupe à la liste
	QStringList SLGroup= QStringList::split( ":", ligneGrp, TRUE); //SLGROUP est une liste des infos présentes sur chaque ligne
	QString nomGrp=SLGroup.first(); // on récupère le nom du groupe (1er élément de la liste)
	
	QString chListeUtils=SLGroup.last(); // on récupère les noms d'utilisateurs (dernier élément de la liste)
	QStringList listeUtilisateurs=QStringList::split ( ",", chListeUtils ); // liste de tous les utilisateurs
	QString mdpGrp=SLGroup[1]; // récupération du mot de passe
	QString admGrp=SLGroup[2]; // récupération des administrateurs du groupe
	groupe * nouveauGroupe= new groupe(nomGrp, mdpGrp, admGrp, listeUtilisateurs); // création d'un groupe
	ListBoxGroups->insertItem(nouveauGroupe); // insertion des groupes
    }
    fclose(fgroup); // Fermeture du fichier groupe
    
    // Récupréation de tous les noms d'utilisateur
    FILE * fuser;
    fuser=fopen("./shadow","r");
    QTextIStream ficUser(fuser); //ouverture du fichier en mode lecture
    QString ligneUser;
    // Ajout des noms d'utilisateurs qui ne sont pas présent dans le fichier shadow
    all_users.append("root");
    all_users.append("bin");
    all_users.append("daemon");
    all_users.append("adm");
    while(!ficUser.atEnd()) //faire tant que ce n'est pas la fin du fichier
    {
	ficUser>>ligneUser; //on récupère une ligne 

	QStringList SLUser= QStringList::split( ":", ligneUser ); //SLUser : liste des infos présentes sur chaque ligne
	QString nomUser=SLUser.first(); // on récupère le nom de l'utilisateur (1er élément de la liste)
	all_users.append(nomUser); // on ajoute l'utilisateur à la liste d'utilisateur
	// ListBoxUsersOut->insertStringList(nomUser);
    }
    fclose(fuser); // Fermeture du fichier utilisateur
    
}

void FormUsers::affusers( QListBoxItem * grp )
{
    ListBoxUsersIn->clear(); // effacement du contenu de la liste des utilisateurs présent dans le groupe
    ListBoxUsersIn->insertStringList(((groupe *) grp)->users);
    QStringList users_in=((groupe*) grp)->users;
    QStringList users_out=all_users;
    int i;
    int total=users_in.count();
    for (i=0;i<total;i++)
    {
	users_out.remove(users_in[i]);
    }
    ListBoxUsersOut->clear();
    ListBoxUsersOut->insertStringList(users_out);
    ListBoxUsersOut->sort(); //trie des noms d'utilisateurs
    ListBoxUsersIn->sort();
}


void FormUsers::AjoutUserIn()
{
    // Ajout de l'utilisateur dans la liste des utilisateurs du groupe
    groupe * grp;
    grp=(groupe *) ListBoxGroups->selectedItem(); // on récupère le groupe
    QString nom_new_user=ListBoxUsersOut->currentText(); // on récupère le nom sélectionné
    (grp->users).append(nom_new_user); // on ajoute l'utilisateur à la liste
    affusers(grp); // actualisation des listes
}

void FormUsers::EnleveUserIn()
{
    // Effacement de l'utilisateur dans la liste des utilisateurs du groupe
    groupe * grp;
    grp=(groupe *) ListBoxGroups->selectedItem(); // on récupère le groupe
    QString nom_user=ListBoxUsersIn->currentText(); // on récupère le nom sélectionné
    (grp->users).remove(nom_user); // on ajoute l'utilisateur à la liste
    affusers(grp); // actualisation des listes
}
