#include <string>
#include <list>
#include <sstream>

#include "user_mgr.h"
#include "user.h"

using namespace std;

/*
    pour acquerir des donnees d'un fichier xml dont le nom est passe en argument
*/

int user_mgr::acquerir(const string& filename){
    user u;
    TiXmlElement *elem;
    xml_filename = filename;

    doc = new TiXmlDocument(filename);
    if(!doc->LoadFile()){
        cerr << "erreur lors du chargement" << endl;
        cerr << "error #" << doc->ErrorId() << " : " << doc->ErrorDesc() << endl;
        return 1;
    }

    TiXmlHandle hdl(doc);
    elem = hdl.FirstChildElement().FirstChildElement().Element();

    if(!elem){
        cerr << "le noeud a atteindre n'existe pas" << endl;
        return 2;
    }

    while (elem){
        u.name = elem->Attribute("name");
        u.pass = elem->Attribute("pass");
        elem->QueryIntAttribute("indice", &u.droits);
        user_list.push_back(u);

        elem = elem->NextSiblingElement(); // iteration
    }

    return 0;
}


/*
    pour modifier l'attribut 'attrib' de l'utilisateur appele 'u' en lui donnant la valeur 'value'
*/

int user_mgr::modifier(const string& u, const string& attrib, const string& value){
    bool trouve = false;
    TiXmlHandle hdl(doc);

    TiXmlElement *elem = hdl.FirstChildElement().FirstChildElement().Element();

    while(elem && !trouve){
        if( string(elem->Attribute("name")) == u){
            trouve = true;
            break;
        }
        elem = elem->NextSiblingElement();
    }

    if (!trouve){
        cerr << "client inexistant" << endl;
        return 1;
    }
    else{
        elem->SetAttribute(attrib, value);
        doc->SaveFile(xml_filename);

        // mise a jour de la liste
        list<user>::iterator i=user_list.begin();
        while(i!=user_list.end() && i->name!=u){
            if(attrib == "name")
                i->name=value;
            else if(attrib == "pass")
                i->pass=value;
            else if(attrib == "droits"){
                istringstream iss(value);
                int int_value;
                iss >> int_value;
                i->droits=int_value;
            }
            else
                cerr << "attribut inconnu" << endl;
            i++;
        }

        return 0;
    }
}

/*
    pour ajouter un utilisateur
*/

int user_mgr::ajouter(const user& u){
    TiXmlElement *f = doc->FirstChildElement();
    ostringstream oss;
    oss << u.droits;

    TiXmlElement le_nouveau ("user");
    le_nouveau.SetAttribute("name"  , u.name);
    le_nouveau.SetAttribute("pass"  , u.pass);
    le_nouveau.SetAttribute("indice", oss.str());

    f->InsertEndChild(le_nouveau);
    doc->SaveFile(xml_filename);

    // mise a jour de la liste
    user_list.push_back(u);

    return 0;
}

int user_mgr::supprimer(const string& name){
    bool trouve = false;
    TiXmlHandle hdl(doc);
    TiXmlElement *elem = hdl.FirstChildElement().FirstChildElement().Element();

    while(elem && !trouve){
        if( string(elem->Attribute("name")) == name){
            trouve = true;
            break;
        }
        elem = elem->NextSiblingElement();
    }

    if (!trouve){
        cerr << "client inexistant" << endl;
        return 1;
    }
    else {
        TiXmlElement *f = doc->FirstChildElement();
        f->RemoveChild(elem);
        doc->SaveFile(xml_filename);

        // mise a jour de la liste
        list<user>::iterator i=user_list.begin();
        while(i!=user_list.end() && i->name!=name)
            i++;

        user_list.erase(i);

        return 0;
    }
}
