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.Ville;

/*****************************************************************************
 * Classe: VilleCrud
 * 
 * Objet ayant pour bout d'ex�cuter les instructions SQL en respectant les  
 * op�rations de la persistance des donn�es.
 * 
 * Liste des dependances
 * -Dataset ville
 * -Connection
 * -Statement
 * 
 * Projet Orford
 *****************************************************************************
 * Modification: Ajout cartouche, ajout de type dataset dans implements Crud<?>
 * Nom: Alfredo Toyo
 * Date: 2013-09-01
 ****************************************************************************
 * Modification: Ajout du champ Statement et suppression de redondance de 
 * ses instances locales par le champ de classe statement �tant ceci initialis� 
 * avec la connection � partir du constructeur.
 * Nom: Alfredo Toyo
 * Date: 2013-09-02
 ****************************************************************************
 * 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 Martin Robinson
 * Objet ayant pour bout d'ex�cuter les instructions SQL en respectant les  
 * op�rations de la persistance des donn�es.
 */
public class VilleCrud implements Crud<Ville> {
	private Connection connection;
	private Statement statement;
	
	/**
	 * Constructeur
	 * @param connection
	 * @throws SQLException 
	 */
	public VilleCrud(Connection connection) throws SQLException{
		this.connection=connection;
		statement = this.connection.createStatement();
	}

	@Override
	public int create(Ville dataset) throws SQLException {
		//create une nouvelle row dans la BD	
		String query = "INSERT INTO ville (ville_p_id,ville_nom,ville_province,ville_pays) "
					 + "VALUES('" + dataset.getville_p_id() + "'," +
				              "'" + dataset.getVille_nom() + "'," +
				              "'" + dataset.getVille_province() + "'," +
				              "'" + dataset.getVille_pays() + "')";
		
		statement.execute(query);

		//retourner le id de se dernier
		return dataset.getville_p_id();
	}

	@Override
	public Ville readById(int id) throws SQLException {
		String query = "SELECT * FROM ville WHERE ville_p_id='"+id+"'";
		ResultSet rs = statement.executeQuery(query);
		rs.next();
		
		//construire le dataset à partir du resultset
		return new Ville(rs.getInt("ville_p_id"),
						 rs.getString("ville_nom"),
						 rs.getString("ville_province"),
						 rs.getString("ville_pays"));
	}

	@Override
	public List<Ville> readAll() throws SQLException {
		List<Ville> lstVille = new ArrayList<Ville>();
		
		String query = "SELECT * FROM ville LIMIT 0,100";
		ResultSet rs = statement.executeQuery(query);
		
		while(rs.next()){
		//construire le dataset à partir du resultset
			Ville tmp = new Ville(rs.getInt("ville_p_id"),
						          rs.getString("ville_nom"),
						          rs.getString("ville_province"),
						          rs.getString("ville_pays"));
			lstVille.add(tmp);
		}

		return lstVille;
	}

	@Override
	public boolean update(Ville dataset) throws SQLException {
		String query = "UPDATE ville "
					 + "SET ville_nom='"+dataset.getVille_nom()+"', "+
		                   "ville_province='"+dataset.getVille_province()+"', "+
		                   "ville_pays='"+dataset.getVille_pays()+"' "+
		               "WHERE ville_p_id='"+dataset.getville_p_id()+"'";
		
		statement.execute(query);

		return true;
	}

	@Override
	public boolean destroy(Ville dataset) throws SQLException {
		String query = "DELETE FROM ville "
					 + "WHERE ville_p_id='"+dataset.getville_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='ville'";
		
		statement.execute(querySequence);
		
		ResultSet rsid = statement.executeQuery("SELECT sequence_dernierid "
											  + "FROM sequence "
											  + "WHERE sequence_nomtable='ville'");
		
		rsid.next();
		
		return rsid.getInt(1);
	}
	
	/**
	 * @param nom
	 * @param province
	 * @param pays
	 * @return list de dataset qui resemble
	 * @throws SQLException
	 */
	public List<Ville> readAllLike(String nom, String province, String pays) throws SQLException {
		List<Ville> lstVille = new ArrayList<Ville>();
		
		String query = "SELECT * FROM ville WHERE ville_nom LIKE '%"+nom+"%' AND "+
					   "ville_province LIKE '%"+province+"%' AND "+
					   "ville_pays LIKE '%"+pays+"%' " +
							   " LIMIT 0,100";
		
		ResultSet rs = statement.executeQuery(query);
		
		while(rs.next()){
		//construire le dataset à partir du resultset
			Ville tmp = new Ville(rs.getInt("ville_p_id"),
						          rs.getString("ville_nom"),
						          rs.getString("ville_province"),
						          rs.getString("ville_pays"));
			lstVille.add(tmp);
		}

		return lstVille;
	}
}