package Databases;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Scanner;

import QCM.QCM;

import utilisateur.*;

public class UserDatabase implements Serializable {

	private ArrayList<Administrateur> AdminList = new ArrayList<Administrateur>();
	private ArrayList<Professeur> ProfList = new ArrayList<Professeur>();
	private ArrayList<Eleve> EleveList = new ArrayList<Eleve>();
	
	public void addUser(Utilisateur u, TypeUser type){
		
		if (type == TypeUser.admin)
			AdminList.add((Administrateur) u);
		
		if (type == TypeUser.eleve)
			EleveList.add((Eleve) u);
		
		if (type == TypeUser.prof)
			ProfList.add((Professeur) u);
		
	}
	
	public Eleve listEleve(){
		
		if (EleveList.size() == 0){
			System.out.println("Pas d'élèves!");
			return null;
		}
		
		for (int i = 0; i < EleveList.size()-1; i++){
		System.out.println((i+1)+") "+EleveList.get(i).getNom());
		}
		System.out.println("Entrez le numéro de l'élève désiré et appuyez sur entrée");
		Scanner sc = new Scanner(System.in);
		return EleveList.get(sc.nextInt());
	}
	
	public TypeUser getType(String id){
		
		for (int i = 0; i < AdminList.size(); i++) {
			if (AdminList.get(i).getId().equals(id))
				return TypeUser.admin;
		}
		
		for (int i = 0; i < EleveList.size(); i++) {
			if (EleveList.get(i).getId().equals(id))
				return TypeUser.eleve;
		}
		
		for (int i = 0; i < ProfList.size(); i++) {
			if (ProfList.get(i).getId().equals(id))
				return TypeUser.prof;
		}
		
		return TypeUser.inexistant;
	}
	
	public Utilisateur getUser(String id, TypeUser type){ 
		//~~c'est dégeulasse~~
		
		if (type==TypeUser.admin)
		{
			for (int i = 0; i < AdminList.size(); i++) {
				
				if (AdminList.get(i).getId().equals(id))
					return AdminList.get(i);
			}
		}
		
		if (type==TypeUser.prof)
		{
			for (int i = 0; i < ProfList.size(); i++) {
				if (ProfList.get(i).getId().equals(id))
					return ProfList.get(i);
			}
		}
		
		if (type==TypeUser.eleve)
		{
			for (int i = 0; i < EleveList.size(); i++) {
				if (EleveList.get(i).getId().equals(id))
					return EleveList.get(i);
			}
		}
		return null;
	}
	
	
	public boolean save(String file){
		
		try {
		      FileOutputStream fichier = new FileOutputStream(file);
		      ObjectOutputStream oos = new ObjectOutputStream(fichier);
		      oos.writeObject(this);
		      oos.close();
		      fichier.close();
		      return true;
		    } catch (final java.io.IOException e){
		        return false;
		    }
	}
	
	public boolean load(String file){
		
		try {
		      FileInputStream fichier = new FileInputStream(file);
		      ObjectInputStream ois = new ObjectInputStream(fichier);
		      
		      try {
		    	UserDatabase Object = (UserDatabase) ois.readObject();
				AdminList=Object.getAdminList();
				EleveList=Object.getEleveList();
				ProfList=Object.getProfList();
				ois.close();
			    fichier.close();
		      	} 
		      	catch (ClassNotFoundException e) {ois.close(); fichier.close(); return false;}
		      
		      return true;
		    } 
			catch (final java.io.IOException e) {return false;}
	}
	

	
	public ArrayList<Administrateur> getAdminList() {
		return AdminList;
	}

	public ArrayList<Professeur> getProfList() {
		return ProfList;
	}

	public ArrayList<Eleve> getEleveList() {
		return EleveList;
	}

	public UserDatabase(String file){
		load(file); //mélol
		
	}
	
	public UserDatabase(){
		addUser(new Administrateur("admin", "admin", "admin", "admin",TypeUser.admin),TypeUser.admin); 
		addUser(new Professeur("prof", "prof", "prof", "prof",TypeUser.prof),TypeUser.prof); 
	}
	
	
}
