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.Eleve;
import model.Promotion;
import model.Utilisateur;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class HandlerPromotions extends DefaultHandler {
	private int balise = 0;
	private String libelle;
	private ArrayList<Promotion> liste;
	private ArrayList<Eleve> listeEleves;
	private ArrayList<Utilisateur> lUtil;

   public HandlerPromotions(ArrayList<Utilisateur> lUtil) {
	   super();
	   this.lUtil = lUtil;
	   liste = new ArrayList<Promotion>();
   }
	
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		switch (qName) {
		case "libelle" : balise = 1;
		break;
		case "eleve" : { listeEleves = new ArrayList<Eleve>(); balise = 2; }
		break;
		}
	}
	
	public void endElement(String uri, String localName, String qName) throws SAXException {
		if (qName.equals("promotion")) {
			ArrayList<Eleve> lelv_tmp = new ArrayList<Eleve>();
			lelv_tmp.addAll(this.listeEleves);
			liste.add(new Promotion(libelle,lelv_tmp));
			listeEleves.clear();
		}
	}
		
	public void characters(char ch[], int start, int length) throws SAXException {
		String input = new String(ch, start, length);
		switch (balise) {
		case 1 : { this.libelle = input; balise = 0; }
		break;
		case 2 : { this.listeEleves.add((Eleve) HandlerUtilisateurs.getUtilisateur(input, lUtil)); balise = 0; }
		}
	}
	
	public ArrayList<Promotion> getListe() {
		return this.liste;
	}
	
	public void addListe(Promotion p) {
		this.liste.add(p);
	}
	
	public static Promotion getPromotion(String libelle, ArrayList<Promotion> liste) {
		int i = 0;
		String tmp = "";
		while (!(tmp.equals(libelle)) && (i < liste.size())) {
			tmp = liste.get(i).getLibelle();
			i++;
		}
		if (tmp.equals(libelle)) {
			return liste.get(i-1);
		} else {
			return null;
		}
	}
	
	public void updateDatabase() {
		int i;
		Promotion p;
		try (Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("bin/data/Promotion.xml"), "utf-8"))) {
			writer.write("<?xml version=\"1.0\"?>\n");
			writer.write("<promotions>\n	");
		    for (i = 0 ; i < this.liste.size() ; i++) {
		    	p = this.liste.get(i);
		    	this.writePromotion(writer,p);
		    }
		    writer.write("\n</promotions>");
		} catch (IOException e) {
		    System.out.println("Error: Database update failed.");
		}  
	}
	
	private void writePromotion(Writer w, Promotion p) throws IOException {
		int i;
		w.write("<promotion>\n		");
		w.write("<libelle>"+p.getLibelle()+"</libelle>\n		");
		if (!p.getListeEleves().isEmpty()) {
			for (i = 0 ; i < p.getListeEleves().size(); i++) {
				w.write("<eleve>"+p.getListeEleves().get(i).getLogin()+"</eleve>\n			");
			}
		}
		w.write("\n	</promotion>\n	");
	}
}
