package Model;

import java.sql.SQLException;
import java.util.List;
import java.util.Observable;

import org.jfree.data.xy.XYSeries;

import Controler.IO.DB;


public class Model extends Observable {

	public List<IUser> getUserList(){
		return DB.getInstance().getAllUsers();
	}
	
	public User addNewUser(final String firstName, final String lastName) throws SQLException {
		final int id = DB.getInstance().addUser(firstName, lastName);
		this.setChanged();
		this.notifyObservers();
		return new User(id, firstName, lastName);
	}
	

	/**
	 * Retourne le pourcentage de fausses acceptations sur tous les log disponibles
	 * @return un entier! ATTENTION a la precision...
	 */
	public int falseApprobRate(){
		//on recup le nombre total de logs de la base
		final int nbOfLogs = DB.getInstance().getNumberOfLogs();
		// on recup ensuite le nb total de fausses acceptations
		final int nbOfFalseApprob = DB.getInstance().getNumberOfFalseApprobation();
		// puis on fait notre petit calcul
		int rate = 0;
		if(nbOfLogs > 0){
			rate = (int) Math.floor(100* (nbOfFalseApprob / (float)nbOfLogs));
		}
		return rate;
	}
	
	/**
	 * Retourne le pourcentage de faux refus sur tous les logs disponibles.
	 */
	public int falseRefusalRate(){
		//on recup le nombre total de logs de la base
		final int nbOfLogs = DB.getInstance().getNumberOfLogs();
		// on recup ensuite le nb total de fausses acceptations
		final int nbOfFalseRefus = DB.getInstance().getNumberOfFalseRefusal();
		// puis on fait notre petit calcul
		int rate = 0;
		if(nbOfLogs > 0) {
			rate = (int) Math.floor(100* (nbOfFalseRefus / (float)nbOfLogs));
		}
		return rate;
	}
	/**
	 * Construit le dataset de reference contenant pour chaque instant t de la signature, la valeur de la pression du stylet
	 * sur la tablette. 
	 * Le temps commence toujours a l'instant 0.
	 * Pour renvoyer une seule valeur de pression parmi les 5 acquisitions de reference faites,
	 * on recupere uniquement la premiere acquisition (choix arbitraire).
	 * @param user L'utilisateur pour lequel on veut recuperer les parametres de la signature
	 * @return Un dataset contenant pour chaque instant t la valeur la pression correspondante.
	 * 
	 */
	public XYSeries buildPressureReferenceDataset(final IUser user, String title){
		//On recherche d'abord l'ID du user donne en parametre
		final IUser userTest = DB.getInstance().findUser(user.getUserFirstName(), user.getUserLastName());
		//on recupere ensuite l'id de la premiere acquisition de l'utilisateur
		IAcquisition acq = DB.getInstance().getFirstAcquisition(userTest);
		//puis on recupere la liste des points correspondants a cette acquisition
		List<IPoint> userPts = DB.getInstance().getAllAPoints(acq);
		// et enfin on construit le dataset contenant les donnees de temps et de pression
		final XYSeries data = new XYSeries(title);
		for(int i=0; i < userPts.size(); i++){
		    data.add(userPts.get(i).getTime(), userPts.get(i).getPressure());// machin.add(valeur en x, valeur en y)
		}
		return data;
	}

	/**
	 * Construit un dataset avec l'evolution de la pression en fonction du temps pour le user specifie
	 * @param the specified user
	 * @param title the title of the serie in the graph
	 * @return
	 */
	public XYSeries buildPressureDataset(final List<IPoint> userPts, String title) {
		final XYSeries data = new XYSeries(title);
		for(int i=0; i < userPts.size(); i++){
		    data.add(userPts.get(i).getTime(), userPts.get(i).getPressure());// machin.add(valeur en x, valeur en y)
		}
		return data;
	}

	/**
	 * @return
	 */
	public int getTotalNbOfLogs() {
		int bddRes = DB.getInstance().getNumberOfLogs();
		if(bddRes >= 0){
			return bddRes;
		} else 
			return 0;
	}
	
}