package model.list;

import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;

import model.*;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class HandlerUtilisateurs extends DefaultHandler {
	private int balise = 0;
	private String nom = "";
	private String prenom = "";
	private String login = "";
	private String motDePasse = "";
	private ArrayList<Module> mod_enseignant;
	
	private ArrayList<Utilisateur> liste;
	private ArrayList<Module> lModules;
	
	public HandlerUtilisateurs(ArrayList<Module> lModules) {
		super();
		this.lModules = lModules;
		liste = new ArrayList<Utilisateur>();
	}
	
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		switch (qName) {
		case "enseignant" : mod_enseignant = new ArrayList<Module>();
		break;
		case "nom" : balise = 1;
		break;
		case "prenom" : balise = 2;
		break;
		case "login" : balise = 3;
		break;
		case "motDePasse" : balise = 4;
		break;
		case "module" : balise = 5;
		break;
		}
	}
		 
	public void endElement(String uri, String localName, String qName) throws SAXException {
		if (qName.equals("administrateur")) {
			liste.add(new Administrateur(nom,prenom,login,motDePasse));
		} else if (qName.equals("enseignant")) {
			ArrayList<Module> lmod_tmp = new ArrayList<Module>();
			lmod_tmp.addAll(mod_enseignant);
			liste.add(new Enseignant(nom,prenom,login,motDePasse,lmod_tmp));
			mod_enseignant.clear();
		} else if (qName.equals("eleve")) {
			liste.add(new Eleve(nom,prenom,login,motDePasse));
		}
	}
		
	public void characters(char ch[], int start, int length) throws SAXException {
		String input = new String(ch, start, length);
		switch (balise) {
		case 1 : { nom = input; balise = 0; }
		break;
		case 2 : { prenom = input; balise = 0; }
		break;
		case 3 : { login = input; balise = 0; }
		break;
		case 4 : { motDePasse = input; balise = 0; }
		break;
		case 5 : { mod_enseignant.add(HandlerModules.getModule(input,lModules)); balise = 0; }
		}
	}
	
	public void setListe(ArrayList<Utilisateur> liste) {
		this.liste = liste;
	}
	
	public ArrayList<Utilisateur> getListe() {
		return this.liste;
	}
	
	public ArrayList<Eleve> getListeEleves() {
		ArrayList<Eleve> liste_eleves = new ArrayList<Eleve>();
		int i;
		
		for (i = 0 ; i < this.liste.size() ; i++) {
			if (this.liste.get(i) instanceof Eleve) {
				liste_eleves.add((Eleve) this.liste.get(i));
			}
		}
		
		return liste_eleves;
	}
	
	public void addListe(Utilisateur u) {
		this.liste.add(u);
	}
	
	public void removeListe(Utilisateur u) {
		this.liste.remove(u);
	}
	
	public static Utilisateur getUtilisateur(String login, ArrayList<Utilisateur> liste) {
		int i = 0;
		String tmp = "";
		while (!(tmp.equals(login)) && (i < liste.size())) {
			tmp = liste.get(i).getLogin();
			i++;
		}
		if (tmp.equals(login)) {
			return liste.get(i-1);
		} else {
			return null;
		}
	}
	
	public void updateDatabase() {
		int i;
		Utilisateur u;
		try (Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("bin/data/Utilisateur.xml"), "utf-8"))) {
			writer.write("<?xml version=\"1.0\"?>\n");
			writer.write("<utilisateurs>\n	");
		    for (i = 0 ; i < this.liste.size() ; i++) {
		    	u = this.liste.get(i);
		    	if (u instanceof Administrateur) {
		    		this.writeAdministrateur(writer,(Administrateur) u);
		    	} else if (u instanceof Enseignant) {
		    		this.writeEnseignant(writer,(Enseignant) u);
		    	} else {
		    		this.writeEleve(writer,(Eleve) u);
		    	}
		    }
		    writer.write("\n</utilisateurs>");
		} catch (IOException e) {
		    System.out.println("Error: Database update failed.");
		}  
	}
	
	private void writeAdministrateur(Writer w, Administrateur a) throws IOException {
		w.write("<administrateur>\n		");
		w.write("<nom>"+a.getNom()+"</nom>\n		");
		w.write("<prenom>"+a.getPrenom()+"</prenom>\n		");
		w.write("<login>"+a.getLogin()+"</login>\n		");
		w.write("<motDePasse>"+a.getMotDePasse()+"</motDePasse>\n	");
		w.write("</administrateur>\n	");
	}
	
	private void writeEnseignant(Writer w, Enseignant e) throws IOException {
		int i;
		w.write("<enseignant>\n		");
		w.write("<nom>"+e.getNom()+"</nom>\n		");
		w.write("<prenom>"+e.getPrenom()+"</prenom>\n		");
		w.write("<login>"+e.getLogin()+"</login>\n		");
		w.write("<motDePasse>"+e.getMotDePasse()+"</motDePasse>\n		");
		w.write("<modules>\n			");
		for (i = 0 ; i < e.getListeModules().size() ; i++) {
			w.write("<module>"+e.getListeModules().get(i).getLibelle()+"</module>\n			");
		}
		w.write("\n		</modules>\n	");
		w.write("</enseignant>\n	");
	}
	
	private void writeEleve(Writer w, Eleve e) throws IOException {
		w.write("<eleve>\n		");
		w.write("<nom>"+e.getNom()+"</nom>\n		");
		w.write("<prenom>"+e.getPrenom()+"</prenom>\n		");
		w.write("<login>"+e.getLogin()+"</login>\n		");
		w.write("<motDePasse>"+e.getMotDePasse()+"</motDePasse>\n		");
		w.write("</eleve>\n	");
	}
}
