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 tool.regEx.Adresse;


/*****************************************************************************
 * Classe: AdresseCrud
 * 
 * Objet ayant pour bout d'ex�cuter les instructions SQL en respectant les
 * op�rations de persistance des donn�es.
 * 
 * Liste des dependances
 * -Dataset Adresse
 * -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 AdresseCrud implements Crud<Adresse> {
	private Connection connection;
	private Statement statement;
	
	/**
	 * Constructeur
	 * @param connection
	 * @throws SQLException 
	 */
	public AdresseCrud(Connection connection) throws SQLException {
		this.connection = connection;
		this.statement = this.connection.createStatement();
	}

	@Override
	public int create(Adresse dataset) throws SQLException {
		//create une nouvelle row dans la BD
		String query = "INSERT INTO adresse ( `adresse_p_id` , `adresse_no_rue_app` , `adresse_codepostal` , `ville_fk_id`) " +
		                                   "VALUES('" + dataset.getadresse_p_id() + "'," +
				                                  "'" + dataset.getadresse_no_rue_app() + "'," +
				                                  "'" + dataset.getAdresse_codepostal() + "'," +
				                                  "'" + dataset.getVille_fk_id() + "')";
		statement.execute(query);

		//Retourner le id de se dernier
		return dataset.getadresse_p_id();
	}

	@Override
	public Adresse readById(int id) throws SQLException {
		String query = "SELECT * FROM adresse WHERE adresse_p_id='"+id+"'";
		ResultSet rs = statement.executeQuery(query);
		rs.next();
		
		//Construire le dataset � partir du resultset
		return new Adresse(rs.getInt("adresse_p_id"),
						   rs.getString("adresse_no_rue_app"),
						   rs.getInt("ville_fk_id"),
						   rs.getString("adresse_codepostal"));
	}

	@Override
	public List<Adresse> readAll() throws SQLException {
		List<Adresse> lstAdresse = new ArrayList<Adresse>();
		
		String query = "SELECT * FROM adresse LIMIT 0, 100";
		ResultSet rs = statement.executeQuery(query);
		
		while(rs.next()){
		//Construire le dataset � partir du resultset
			Adresse tmp = new Adresse(rs.getInt("adresse_p_id"),
						              rs.getString("adresse_no_rue_app"),
						              rs.getInt("ville_fk_id"),
						              rs.getString("adresse_codepostal"));
			lstAdresse.add(tmp);
		}
		
		return lstAdresse;
	}

	@Override
	public boolean update(Adresse dataset) throws SQLException {
		String query = "UPDATE adresse "
					 + "SET adresse_no_rue_app='"+dataset.getadresse_no_rue_app()+"', "+
		                   "ville_fk_id='"+dataset.getVille_fk_id()+"', "+
		                   "adresse_codepostal='"+dataset.getAdresse_codepostal()+"' "
		             + "WHERE adresse_p_id='"+dataset.getadresse_p_id()+"'";
		
		statement.execute(query);
		
		return true;
	}

	@Override
	public boolean destroy(Adresse dataset) throws SQLException {
		String query = "DELETE FROM adresse "
					 + "WHERE adresse_p_id='"+dataset.getadresse_p_id()+"'";
		
		statement.execute(query);
		
		return true;
	}

	@Override
	public int getNewSequenceId() throws SQLException {
		//Mettre � jour la sequence, et obFk_categorietenir le id de sa table
		String querySequence = "UPDATE sequence " + 
		                       "SET sequence_dernierid=sequence_dernierid+1 " +
				               "WHERE sequence_nomtable='adresse'";
		
		statement.execute(querySequence);
		
		ResultSet rsid = statement.executeQuery("SELECT sequence_dernierid "
											  + "FROM sequence "
											  + "WHERE sequence_nomtable='adresse'");
		
		rsid.next();

		return rsid.getInt("sequence_dernierid");
	}
	
	/**
	 * @param id
	 * @return list de dataset selon la fk ville
	 * @throws SQLException
	 */
	public List<Adresse> readByFk_ville(int id) throws SQLException {
		String query = "SELECT * FROM adresse WHERE ville_fk_id='"+id+"'";
		List<Adresse> lst = new ArrayList<Adresse>();
		ResultSet rs = statement.executeQuery(query);
		
		while(rs.next()){
			//Construire le dataset � partir du resultset
				Adresse tmp = new Adresse(rs.getInt("adresse_p_id"),
							              rs.getString("adresse_no_rue_app"),
							              rs.getInt("ville_fk_id"),
							              rs.getString("adresse_codepostal"));
				lst.add(tmp);
			}
		
		//Construire le dataset � partir du resultset
		return lst;
	}
	
	/**
	 * @param adresse
	 * @param codePostal
	 * @param ville_fk_id
	 * @return list de dataset qui resemble
	 * @throws SQLException
	 */
	public List<Adresse> readAllLike(String adresse, String codePostal , String ville, String province, String pays) throws SQLException {
		String query = "SELECT * FROM adresse, ville WHERE "+
	                   "adresse_no_rue_app LIKE '%"+adresse+"%' AND "+
					   "adresse_codepostal LIKE '%"+codePostal+"%' AND "+
					   "ville_nom LIKE '%"+ville+"%' AND " +
					   "ville_province LIKE '%"+province+"%' AND " +
					   "ville_pays LIKE '%"+pays+"$' AND " +
					   "ville_fk_id LIKE ville_p_id" +
					   " LIMIT 0, 100";
		List<Adresse> lst = new ArrayList<Adresse>();
		ResultSet rs = statement.executeQuery(query);
		
		while(rs.next()){
				Adresse tmp = new Adresse(rs.getInt("adresse_p_id"),
							              rs.getString("adresse_no_rue_app"),
							              rs.getInt("ville_fk_id"),
							              rs.getString("adresse_codepostal"));
				lst.add(tmp);
			}
		
		return lst;
	}
}
