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.Chambre;

/*****************************************************************************
 * Classe: ChambreCrud
 * 
 * Objet ayant pour bout d'ex�cuter les instructions SQL en respectant les
 * op�rations de persistance des donn�es.
 * 
 * Liste des dependances
 * -Dataset chambre
 * -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 ChambreCrud implements Crud<Chambre> {
	private Connection connection;
	private Statement statement;
	
	/**
	 * Constructeur
	 * @param connection
	 * @throws SQLException 
	 */
	public ChambreCrud(Connection connection) throws SQLException {
		this.connection = connection;
		statement = this.connection.createStatement();
	}

	@Override
	public int create(Chambre dataset) throws SQLException {
		//create une nouvelle row dans la BD
		String query = "INSERT INTO chambre (chambre_p_id,chambre_nombredelits,chambre_devantlhotel,chambre_nombreEtage,chambre_numero,chambre_description) "
					 + "VALUES('" + dataset.getChambre_p_id() + "'," +
				              "'" + dataset.getChambre_nombredelits() + "'," +
				              "'" + (dataset.isChambre_devantlhotel()?'V':'F') + "'," +
				              "'" + dataset.getChambre_nombreEtage() + "'," +
				              "'" + dataset.getChambre_numero() + "'," +
				              "'" + dataset.getChambre_description() + "')";
		
		statement.execute(query);

		//Retourner le id de se dernier
		return dataset.getChambre_p_id();
	}

	@Override
	public Chambre readById(int id) throws SQLException {
		String query = "SELECT * FROM chambre WHERE chambre_p_id='"+id+"'";
		ResultSet rs = statement.executeQuery(query);
		rs.next();
		
		//Construire le dataset � partir du resultset
		return new Chambre(rs.getInt("chambre_p_id"),
						   rs.getInt("chambre_nombredelits"),
						   rs.getString("chambre_devantlhotel").equals("V"),
						   rs.getInt("chambre_nombreEtage"),
						   rs.getString("chambre_description"),
						   rs.getInt("chambre_numero"));
	}

	@Override
	public List<Chambre> readAll() throws SQLException {
		List<Chambre> lstChambre = new ArrayList<Chambre>();
		
		String query = "SELECT * FROM chambre LIMIT 0,100";
		ResultSet rs = statement.executeQuery(query);
		
		while(rs.next()){
		//Construire le dataset � partir du resultset
			Chambre tmp = new Chambre(rs.getInt("chambre_p_id"),
					   				  rs.getInt("chambre_nombredelits"),
					   				  rs.getString("chambre_devantlhotel").equals("V"),
					   				  rs.getInt("chambre_nombreEtage"),
					   				  rs.getString("chambre_description"),
					   				  rs.getInt("chambre_numero"));
			lstChambre.add(tmp);
		}
		
		return lstChambre;
	}

	@Override
	public boolean update(Chambre dataset) throws SQLException {
		String query = "UPDATE chambre "
					 + "SET chambre_nombredelits='"+dataset.getChambre_nombredelits()+"', "+
		                   "chambre_devantlhotel='"+(dataset.isChambre_devantlhotel()?'V':'F')+"', "+
		                   "chambre_nombreEtage='"+dataset.getChambre_nombreEtage()+"', "+
		                   "chambre_description='"+dataset.getChambre_description()+"', "+
		                   "chambre_numero='"+ dataset.getChambre_numero() +"' "+
		               "WHERE chambre_p_id='"+dataset.getChambre_p_id()+"'";
		
		statement.execute(query);
		return true;
	}

	@Override
	public boolean destroy(Chambre dataset) throws SQLException {
		String query = "DELETE FROM chambre WHERE chambre_p_id='"+dataset.getChambre_p_id()+"'";
		
		statement.execute(query);
		return true;
	}

	@Override
	public int getNewSequenceId() throws SQLException {
		//Mettre � jour la sequence, et obtenir le id de sa table
		String querySequence = "UPDATE sequence " + 
		                       "SET sequence_dernierid=sequence_dernierid+1 " +
				               "WHERE sequence_nomtable='chambre'";
		
		statement.execute(querySequence);
		
		ResultSet rsid = statement.executeQuery("SELECT sequence_dernierid "
											  + "FROM sequence "
											  + "WHERE sequence_nomtable='chambre'");
		
		rsid.next();
		
		return rsid.getInt(1);		 
	}
	
	/**
	 * @param numero
	 * @return dataset selon le numero de chambre
	 * @throws SQLException
	 */
	public Chambre readByNumero(int numero) throws SQLException{
		String query = "SELECT * FROM chambre WHERE chambre_numero='"+numero+"'";
		ResultSet rs = statement.executeQuery(query);
		rs.next();
		
		//Construire le dataset � partir du resultset
		return new Chambre(rs.getInt("chambre_p_id"),
						   rs.getInt("chambre_nombredelits"),
						   rs.getString("chambre_devantlhotel").equals("V"),
						   rs.getInt("chambre_nombreEtage"),
						   rs.getString("chambre_description"),
						   rs.getInt("chambre_numero"));
	}
	
	/**
	 * @param nombredelits
	 * @param devant
	 * @param nombreEtage
	 * @param description
	 * @return list de dataset qui resemble
	 * @throws SQLException
	 */
	public List<Chambre> readAllLike(String nombredelits, String devant, String nombreEtage, String debut, String fin) throws SQLException {
		List<Chambre> lstChambre = new ArrayList<Chambre>();
		
		String query = "SELECT * FROM chambre WHERE " + 
					   "chambre_nombredelits LIKE '"+(!nombredelits.equals("")?nombredelits:"%%")+"' AND "+
					   "chambre_devantlhotel LIKE '"+(!devant.equals("")?devant:"%%")+"' AND "+
					   "chambre_nombreEtage LIKE '"+(!nombreEtage.equals("")?nombreEtage:"%%")+"' AND "+
					   "NOT EXISTS(SELECT 1 FROM reservation WHERE ("+
					        "(reservation_debut BETWEEN '"+debut+"' AND '"+fin+"') OR "+
					        "(reservation_fin BETWEEN '"+debut+"' AND '"+fin+"')) AND "+
					        "reservation.chambre_fk_id = chambre.chambre_p_id)" +
							   " LIMIT 0,100";
		ResultSet rs = statement.executeQuery(query);
		
		while(rs.next()){
		//Construire le dataset � partir du resultset
			Chambre tmp = new Chambre(rs.getInt("chambre_p_id"),
					   				  rs.getInt("chambre_nombredelits"),
					   				  rs.getString("chambre_devantlhotel").equals("V"),
					   				  rs.getInt("chambre_nombreEtage"),
					   				  rs.getString("chambre_description"),
					   				  rs.getInt("chambre_numero"));
			lstChambre.add(tmp);
		}
		
		return lstChambre;
	}
}