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.Groupe;

/*****************************************************************************
 * Classe: GroupeCrud
 * 
 * Objet ayant pour bout d'ex�cuter les instructions SQL en respectant les
 * op�rations de persistance des donn�es.
 * 
 * Liste des dependances
 * -Dataset groupe
 * -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 GroupeCrud implements Crud<Groupe> {
	private Connection connection;
	private Statement statement;
	
	/**
	 * Constructeur
	 * @param connection
	 * @throws SQLException
	 */
	public GroupeCrud(Connection connection) throws SQLException {
		this.connection = connection;
		this.statement = this.connection.createStatement();
	}

	@Override
	public int create(Groupe dataset) throws SQLException {
		//create une nouvelle row dans la BD
		String query = "INSERT INTO groupe (groupe_p_id,groupe_nom,client_fk_id) "
				     + "VALUES('"  + dataset.getgroupe_p_id() + "', " + 
				               "'" + dataset.getGroupe_nom() + "', " +
				               "'" + dataset.getClient_fk_id() + "')";

		statement.execute(query);
		
		//Retourner le id de se dernier
		return dataset.getgroupe_p_id();
	}

	@Override
	public Groupe readById(int id) throws SQLException {
		String query = "SELECT * FROM groupe "
					 + "WHERE groupe_p_id='"+id+"'";

		ResultSet rs = statement.executeQuery(query);
		rs.next();
		
		//Construire le dataset � partir du resultset
		return new Groupe(rs.getInt("groupe_p_id"),
						  rs.getInt("client_fk_id"),
						  rs.getString("groupe_nom"));
	}

	@Override
	public List<Groupe> readAll() throws SQLException {
		List<Groupe> lstGroupe = new ArrayList<Groupe>();
		
		String query = "SELECT * FROM groupe LIMIT 0,100";
		ResultSet rs = statement.executeQuery(query);
		
		while(rs.next()){
		//Construire le dataset � partir du resultset
			Groupe tmp = new Groupe(rs.getInt("groupe_p_id"),
					                rs.getInt("client_fk_id"),
					                rs.getString("groupe_nom"));
			lstGroupe.add(tmp);
		}
		
		return lstGroupe;
	}

	@Override
	public boolean update(Groupe dataset) throws SQLException {
		String query = "UPDATE groupe "
					 + "SET client_fk_id='"+dataset.getClient_fk_id()+"', "
				     +     "groupe_nom='"+dataset.getGroupe_nom()+"' "
					 + "WHERE groupe_p_id='"+dataset.getgroupe_p_id()+"'";

		statement.execute(query);

		return true;
	}

	@Override
	public boolean destroy(Groupe dataset) throws SQLException {
		String query = "DELETE FROM groupe "
					 + "WHERE groupe_p_id='"+dataset.getgroupe_p_id()+"'";

		statement.execute(query);

		return true;
	}

	@Override
	public int getNewSequenceId() throws SQLException {
		String querySequence = "UPDATE sequence " + 
                			   "SET sequence_dernierid=sequence_dernierid+1 " +
                			   "WHERE sequence_nomtable='groupe'";
		
		statement.execute(querySequence);
		
		ResultSet rsid = statement.executeQuery("SELECT sequence_dernierid "
											  + "FROM sequence "
											  + "WHERE sequence_nomtable='groupe'");

		rsid.next();
		
		return rsid.getInt(1);
	}
	
	/**
	 * @param id
	 * @return list de dataset selon la fk client
	 * @throws SQLException
	 */
	public List<Groupe> readByFk_client(int id) throws SQLException {
		String query = "SELECT * FROM groupe "
					 + "WHERE client_fk_id='"+id+"'";
		List<Groupe> lst = new ArrayList<Groupe>();
		ResultSet rs = statement.executeQuery(query);
		
		while(rs.next()){
			//Construire le dataset � partir du resultset
				  Groupe tmp = new Groupe(rs.getInt("groupe_p_id"),
										  rs.getInt("client_fk_id"),
										  rs.getString("groupe_nom"));
				lst.add(tmp);
			}
		
		//Construire le dataset � partir du resultset
		return lst;
	}
	
	/**
	 * @param client_fk_id
	 * @param nom
	 * @return list de dataset qui resemble
	 * @throws SQLException
	 */
	public List<Groupe> readAllLike(String clientNom, String clientPrenom, String groupeNom) throws SQLException {
		List<Groupe> lstGroupe = new ArrayList<Groupe>();
		
		String query = "SELECT * FROM groupe "+
					   "INNER JOIN client ON client_p_id=client_fk_id " +
					   "WHERE client_nom LIKE '%"+clientNom+"%' " +
					   "AND client_prenom LIKE '%"+clientPrenom+"%' " +
					   "AND groupe_nom LIKE '%"+groupeNom+"%'" +
							   " LIMIT 0,100";
		
		ResultSet rs = statement.executeQuery(query);
		
		while(rs.next()){
		//Construire le dataset � partir du resultset
			Groupe tmp = new Groupe(rs.getInt("groupe_p_id"),
					                rs.getInt("client_fk_id"),
					                rs.getString("groupe_nom"));
			lstGroupe.add(tmp);
		}
		
		return lstGroupe;
	}
}