package database.crud;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;


import database.Crud;
import database.dataset.Utilisateur;

/*****************************************************************************
 * Classe: UtilisateurCrud
 * 
 * Objet ayant pour bout d'ex�cuter les instructions SQL en respectant les
 * op�rations de persistance des donn�es.
 * 
 * Liste des dependances
 * -Dataset utilisateur
 * -Connection
 * -Statement
 * 
 * Projet Orford
 ****************************************************************************
 * Modification: Ajout dela m�thode getNewSequenceId(), ajout de control du
 * commit pour instructions multiples pour la m�thode create().
 * Nom: Alfredo Toyo
 * Date: 2013-09-06
 ****************************************************************************/

/**
 * @author Alfredo Toyo
 * Objet ayant pour bout d'ex�cuter les instructions SQL en respectant les
 * op�rations de persistance des donn�es.
 */
public class UtilisateurCrud implements Crud<Utilisateur> {
	private Connection connection;
	private Statement statement;
	
	/**
	 * Constructeur
	 * @param connection
	 * @throws SQLException 
	 */
	public UtilisateurCrud(Connection connection) throws SQLException {
		this.connection = connection;
		this.statement = this.connection.createStatement();
	}

	@Override
	public int create(Utilisateur dataset) throws SQLException {
		//create une nouvelle row dans la BD
		String query = "INSERT INTO utilisateur (utilisateur_p_id,utilisateur_nom,utilisateur_motdepasse,utilisateur_actif,groupe_utilisateur_fk_id) "
					 + "VALUES('" + dataset.getutilisateur_p_id() + "'," +
				              "'" + dataset.getUtilisateur_nom() + "'," +
				              "'" + dataset.getUtilisateur_motdepasse() + "'," +
				              "'" + (dataset.getUtilisateur_actif()?"V":"F") + "'," +
				              "'" + dataset.getGroupe_utilisateur_fk_id() + "')";
		
		statement.execute(query);

		//Retourner le id de se dernier
		return dataset.getutilisateur_p_id();
	}

	@Override
	public Utilisateur readById(int id) throws SQLException {
		String query = "SELECT * FROM utilisateur WHERE utilisateur_p_id='"+id+"'";
		ResultSet rs = statement.executeQuery(query);
		rs.next();
		
		//Construire le dataset � partir du resultset
		return new Utilisateur(rs.getInt("utilisateur_p_id"),
						   	   rs.getString("utilisateur_nom"),
						   	   rs.getString("utilisateur_motdepasse"),
						   	   rs.getString("utilisateur_actif").equals("V"),
						   	   rs.getInt("groupe_utilisateur_fk_id"));
	}

	@Override
	public List<Utilisateur> readAll() throws SQLException {
		List<Utilisateur> lstUtilisateur = new ArrayList<Utilisateur>();
		
		String query = "SELECT * FROM utilisateur LIMIT 0,100";
		ResultSet rs = statement.executeQuery(query);
		
		while(rs.next()){
		//Construire le dataset � partir du resultset
			Utilisateur tmp = new Utilisateur(rs.getInt("utilisateur_p_id"),
				   	   						  rs.getString("utilisateur_nom"),
				   	   						  rs.getString("utilisateur_motdepasse"),
										   	  rs.getString("utilisateur_actif").equals("V"),
				   	   						  rs.getInt("groupe_utilisateur_fk_id"));
			lstUtilisateur.add(tmp);
		}
		
		return lstUtilisateur;
	}

	@Override
	public boolean update(Utilisateur dataset) throws SQLException {
		String query = "UPDATE utilisateur "
					 + "SET  utilisateur_nom='"+dataset.getUtilisateur_nom()+"', "+
					  	    "utilisateur_motdepasse='"+dataset.getUtilisateur_motdepasse()+"', "+
							"utilisateur_actif='"+(dataset.getUtilisateur_actif()?'V':'F')+"', "+
							"groupe_utilisateur_fk_id='"+dataset.getGroupe_utilisateur_fk_id()+"' "+
					   "WHERE utilisateur_p_id='"+dataset.getutilisateur_p_id()+"'";
	
		statement.execute(query);

		return true;
	}

	@Override
	public boolean destroy(Utilisateur dataset) throws SQLException {
		String query = "DELETE FROM utilisateur "
					 + "WHERE utilisateur_p_id='"+dataset.getutilisateur_p_id()+"'";
		
		statement.execute(query);
		
		return true;
	}

	@Override
	public int getNewSequenceId() throws SQLException {
		ResultSet rsid = statement.executeQuery("SELECT get_next_sequence_id('utilisateur')");
		
		rsid.next();
		
		return rsid.getInt(1);
	}
	
	/**
	 * @param id
	 * @return list de dataset selon la fk groupe utilisateur
	 * @throws SQLException
	 */
	public List<Utilisateur> readByFk_groupe_utilisateur(int id) throws SQLException {
		String query = "SELECT * FROM utilisateur WHERE groupe_utilisateur_fk_id='"+id+"'";
		List<Utilisateur> lst = new ArrayList<Utilisateur>();
		ResultSet rs = statement.executeQuery(query);
		
		while(rs.next()){
			//Construire le dataset � partir du resultset
				  Utilisateur tmp = new Utilisateur(rs.getInt("utilisateur_p_id"),
											   	   rs.getString("utilisateur_nom"),
											   	   rs.getString("utilisateur_motdepasse"),
											   	   rs.getString("utilisateur_actif").equals("V"),
											   	   rs.getInt("groupe_utilisateur_fk_id"));
				lst.add(tmp);
			}
		
		//Construire le dataset � partir du resultset
		return lst;
	}
	
	/**
	 * @param nom
	 * @param actif
	 * @param groupe_utilisateur_fk_id
	 * @return list de dataset qui resemble
	 * @throws SQLException
	 */
	public List<Utilisateur> readAllLike(String nom, String actif, String groupe_utilisateur, String employe_nom, String employe_prenom) throws SQLException {
		List<Utilisateur> lstUtilisateur = new ArrayList<Utilisateur>();
		
		String query = "SELECT * FROM utilisateur "+
					   "INNER JOIN employe ON utilisateur_p_id=utilisateur_fk_id " +
					   "INNER JOIN groupe_utilisateur ON groupe_utilisateur_p_id=groupe_utilisateur_fk_id " +
		               "WHERE utilisateur_nom LIKE '%"+nom+"%' "+
					   "AND utilisateur_actif LIKE '%" + actif + "%' " +
		               "AND groupe_utilisateur_nom LIKE '%" + groupe_utilisateur + "%' " +
					   "AND employe_nom LIKE '%" + employe_nom + "%' " +
		               "AND employe_prenom LIKE '%" + employe_prenom + "%'" +
		               " LIMIT 0,100";
					   
		ResultSet rs = statement.executeQuery(query);
		
		while(rs.next()){
		//Construire le dataset � partir du resultset
			Utilisateur tmp = new Utilisateur(rs.getInt("utilisateur_p_id"),
				   	   						  rs.getString("utilisateur_nom"),
				   	   						  rs.getString("utilisateur_motdepasse"),
										   	  rs.getString("utilisateur_actif").equals("V"),
				   	   						  rs.getInt("groupe_utilisateur_fk_id"));
			lstUtilisateur.add(tmp);
		}
		
		return lstUtilisateur;
	}
}