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.Encaissement;

/*****************************************************************************
 * Classe: EncaissementCrud
 * 
 * Objet ayant pour bout d'ex�cuter les instructions SQL en respectant les
 * op�rations de persistance des donn�es.
 * 
 * Liste des dependances
 * -Dataset encaissement
 * -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 EncaissementCrud implements Crud<Encaissement> {
	private Connection connection;
	private Statement statement;
	
	/**
	 * Constructeur
	 * @param connection
	 * @throws SQLException 
	 */
	public EncaissementCrud(Connection connection) throws SQLException {
		this.connection = connection;
		statement = this.connection.createStatement();
	}
	
	@Override
	public int create(Encaissement dataset) throws SQLException {
		//create une nouvelle row dans la BD
		String query = "INSERT INTO encaissement (encaissement_p_id,encaissement_montant,facture_fk_id,modedepaiement_fk_id) "
					 + "VALUES('"  + dataset.getencaissement_p_id() + "'," +
				               "'" + dataset.getEncaissement_montant() + "'," +
				               "'" + dataset.getFacture_fk_id() + "'," +
				               "'" + dataset.getModedepaiement_fk_id() + "')";
		
		statement.execute(query);
		
		//Retourner le id de se dernier
		return dataset.getencaissement_p_id();
	}

	@Override
	public Encaissement readById(int id) throws SQLException {
		String query = "SELECT * FROM encaissement WHERE encaissement_p_id='"+id+"'";
		ResultSet rs = statement.executeQuery(query);
		rs.next();
		
		//Construire le dataset � partir du resultset
		return new Encaissement(rs.getInt("encaissement_p_id"),
						   		rs.getInt("facture_fk_id"),
						   		rs.getInt("modedepaiement_fk_id"),
						   		rs.getBigDecimal("encaissement_montant"));
	}

	@Override
	public List<Encaissement> readAll() throws SQLException {
		List<Encaissement> lstEncaissement = new ArrayList<Encaissement>();
		
		String query = "SELECT * FROM encaissement LIMIT 0,100";
		ResultSet rs = statement.executeQuery(query);
		
		while(rs.next()){
		//Construire le dataset � partir du resultset
			Encaissement tmp = new Encaissement(rs.getInt("encaissement_p_id"),
			   									rs.getInt("facture_fk_id"),
			   									rs.getInt("modedepaiement_fk_id"),
			   									rs.getBigDecimal("encaissement_montant"));
			lstEncaissement.add(tmp);
		}
		
		return lstEncaissement;
	}

	@Override
	public boolean update(Encaissement dataset) throws SQLException {
		String query = "UPDATE encaissement "
				     + "SET facture_fk_id='"+dataset.getFacture_fk_id()+"', "+
                		   "modedepaiement_fk_id='"+dataset.getModedepaiement_fk_id()+"', "+
                		   "encaissement_montant='"+dataset.getEncaissement_montant()+"' "+
                	   "WHERE encaissement_p_id='"+dataset.getencaissement_p_id()+"'";
		
		statement.execute(query);

		return true;
	}

	@Override
	public boolean destroy(Encaissement dataset) throws SQLException {
		String query = "DELETE FROM encaissement "
				     + "WHERE encaissement_p_id='"+dataset.getencaissement_p_id()+"'";
		
		statement.execute(query);
		
		return true;
	}

	@Override
	public int getNewSequenceId() throws SQLException {
		ResultSet rsid = statement.executeQuery("SELECT get_next_sequence_id('encaissement')");
		
		rsid.next();
		
		return rsid.getInt(1);
	}
	
	/**
	 * @param id
	 * @return list de dataset selon la fk facture
	 * @throws SQLException
	 */
	public List<Encaissement> readByFk_facture(int id) throws SQLException {
		String query = "SELECT * FROM encaissement WHERE facture_fk_id='"+id+"'";
		ResultSet rs = statement.executeQuery(query);
		List<Encaissement> lst = new ArrayList<Encaissement>();
		
		while(rs.next()){
			//Construire le dataset � partir du resultset
				  Encaissement tmp = new Encaissement(rs.getInt("encaissement_p_id"),
											   		rs.getInt("facture_fk_id"),
											   		rs.getInt("modedepaiement_fk_id"),
											   		rs.getBigDecimal("encaissement_montant"));
				lst.add(tmp);
			}
		
		//Construire le dataset � partir du resultset
		return lst;
	}
	
	/**
	 * @param id
	 * @return list de dataset selon la fk modedepaiement
	 * @throws SQLException
	 */
	public List<Encaissement> readByFk_modedepaiement(int id) throws SQLException {
		String query = "SELECT * FROM encaissement WHERE modedepaiement_fk_id='"+id+"'";
		List<Encaissement> lst = new ArrayList<Encaissement>();
		ResultSet rs = statement.executeQuery(query);
		
		while(rs.next()){
			//Construire le dataset � partir du resultset
				  Encaissement tmp = new Encaissement(rs.getInt("encaissement_p_id"),
											   		rs.getInt("facture_fk_id"),
											   		rs.getInt("modedepaiement_fk_id"),
											   		rs.getBigDecimal("encaissement_montant"));
				lst.add(tmp);
			}
		
		//Construire le dataset � partir du resultset
		return lst;
	}
	
	/**
	 * @param facture_fk_id
	 * @param modedepaiement_fk_id
	 * @return list de dataset qui resemble
	 * @throws SQLException
	 */
	public List<Encaissement> readAllLike(String factureDate, String clientNom, String clientPrenom, String modedepaiement) throws SQLException {
		List<Encaissement> lstEncaissement = new ArrayList<Encaissement>();
		
		String query = "SELECT * FROM encaissement "+
					   "INNER JOIN facture ON facture_p_id=facture_fk_id "+
		               "INNER JOIN modedepaiement ON modedepaiement_p_id=modedepaiement_fk_id "+
		               "INNER JOIN client ON client_p_id=client_fk_id "+
		               "WHERE facture_jour LIKE '%"+factureDate+"%' "+
		               "AND client_nom LIKE '%"+clientNom+"%' "+
		               "AND client_prenom LIKE '%"+clientPrenom+"%' "+
		               "AND modedepaiement_nom LIKE '%"+modedepaiement+"%' " +
							   " LIMIT 0,100";
		               
		ResultSet rs = statement.executeQuery(query);
		
		while(rs.next()){
		//Construire le dataset � partir du resultset
			Encaissement tmp = new Encaissement(rs.getInt("encaissement_p_id"),
			   									rs.getInt("facture_fk_id"),
			   									rs.getInt("modedepaiement_fk_id"),
			   									rs.getBigDecimal("encaissement_montant"));
			lstEncaissement.add(tmp);
		}
		
		return lstEncaissement;
	}
}