package controler.recherche;

import java.sql.Connection;
import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.List;

import language.Language;
import tool.regEx.Adresse;
import view.vueFacture.VueFacture;
import view.vueRechercheReservation.VueRechercheReservation;
import commander.Commander;
import controler.Message;
import database.crud.AdresseCrud;
import database.crud.ClientCrud;
import database.crud.FactureCrud;
import database.crud.GroupeCrud;
import database.crud.ReservationCrudGeneral;
import database.crud.StatusChambreCrud;
import database.crud.TelephoneCrud;
import database.crud.VilleCrud;
import database.crud.reservation.ReservationGroupeCrud;
import database.crud.reservation.ReservationIndividuCrud;
import database.crud.vente.LocationChambreCrud;
import database.crud.vente.VenteCrud;
import database.dataset.Client;
import database.dataset.Facture;
import database.dataset.Groupe;
import database.dataset.Location_chambre;
import database.dataset.Reservation;
import database.dataset.Reservation_groupe;
import database.dataset.Reservation_individu;
import database.dataset.Vente;
import database.dataset.Ville;
import database.tools.IsolationLevel;

/**
 * @author Alfredo Toyo
 *
 */
public class ControlerRechercheReservation {
	public static final Message reveil = new Message(){
		public void trigger(Object caster) throws Exception {
			recherche.trigger(caster);
		}
	};
	
	public static final Message recherche = new Message(){
		public void trigger(Object caster) throws Exception {
			if (!(caster instanceof VueRechercheReservation))
				return;
			VueRechercheReservation vue = (VueRechercheReservation)caster;
			Connection connection = Commander.getInstance().getConnectionBD();
//			IsolationLevel isolation = new IsolationLevel(connection);
//			isolation.setSERIALIZABLE();

			vue.clearReservation();
		
			ReservationCrudGeneral  reservationCrudGeneral  = new ReservationCrudGeneral(connection);
			ClientCrud 				clientCrud              = new ClientCrud(connection);
			GroupeCrud 				groupeCrud				= new GroupeCrud(connection);
			StatusChambreCrud       statusChambreCrud 		= new StatusChambreCrud(connection);
			ReservationGroupeCrud   reservationGroupeCrud   = new ReservationGroupeCrud(connection);
			ReservationIndividuCrud reservationIndividuCrud = new ReservationIndividuCrud(connection);
			FactureCrud 			factureCrud				= new FactureCrud(connection);
			LocationChambreCrud		location_chambreCrud	= new LocationChambreCrud(connection);
			
			SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
			java.util.Date parsedA = format.parse(vue.getDateFieldDateArrivee());
			Date sqlA = new Date(parsedA.getTime());
			Date dateArrivee = sqlA;			
			java.util.Date parsedD = format.parse(vue.getDateFieldDateDepart());
			Date sqlD = new Date(parsedD.getTime());
			Date dateDepart = sqlD;
			
			String nomClient 	= vue.getTextFieldNomClient();
			String prenomClient = vue.getTextFieldPrenomClient();
			String nomGroupe 	= vue.getTextFieldNomGroupe();
			
			Client client = new Client(0, "", "", 0, "");
			Groupe groupe = new Groupe(0, 0, "");

			if(!nomGroupe.equals("")){
				List<Reservation> reservations = reservationCrudGeneral.readAllLikeRechercheGroupe(dateArrivee, dateDepart, nomGroupe);
				List<Client>      clients      = clientCrud.readAllLike(nomClient, prenomClient, "", "", "", "", "", "", "");
				
				for(Reservation reservation : reservations){
					boolean temoin = false;
					Reservation_groupe reservation_groupe = reservationGroupeCrud.readById(reservation.getReservation_p_id());
					if(reservation_groupe != null){
						groupe = groupeCrud.readById(reservation_groupe.getGroupe_fk_id());
						for(Client aClient : clients){
							if(aClient.getClient_p_id() == groupe.getClient_fk_id()){
								client = aClient;
								temoin = true;
								break;
							}
						}
					}

					if(temoin){
						List<Location_chambre> locations_chambre = location_chambreCrud.readByreservation_fk(reservation.getReservation_p_id());						
						Facture facture = factureCrud.readById(locations_chambre.get(0).getFacture_fk_id());
						
						vue.addLineToTableReservation(facture.getFacture_p_id(),
													  reservation.getReservation_debut(), 
													  reservation.getReservation_fin(), 
													  client.getClient_nom(),
													  client.getClient_prenom(),
													  groupe.getGroupe_nom(),
													  reservation.getChambre_fk_id(), 
													  statusChambreCrud.readById(reservation.getStatus_fk_id()).getStatus_description(),
													  reservation.getReservation_commentaire());
					}
				}
			}
			else{
				List<Reservation> reservations = reservationCrudGeneral.readAllBetween(vue.getDateFieldDateArrivee(), 
						   															   vue.getDateFieldDateDepart());
				
				boolean rechercheParClient = false;
				List<Client> clients = null;
				
				if((!nomClient.equals("") || !prenomClient.equals("")) && nomGroupe.equals("")){
					rechercheParClient = true;
					clients = clientCrud.readAllLike(nomClient, prenomClient, "", "", "", "", "", "", "");
				}
				else{
					rechercheParClient = false;
				}
				
				for(Reservation reservation : reservations){
					List<Location_chambre> locations_chambre = location_chambreCrud.readByreservation_fk(reservation.getReservation_p_id());						
					Facture facture = factureCrud.readById(locations_chambre.get(0).getFacture_fk_id());					
					boolean temoin = false;
					
					Reservation_individu reservation_individu = reservationIndividuCrud.readById(reservation.getReservation_p_id());
					if(reservation_individu != null){
						if(rechercheParClient){
							for(Client aClient : clients){
								if(aClient.getClient_p_id() == reservation_individu.getClient_fk_id()){
									client = aClient;
									temoin = true;
									break;
								}
							}
						}
						else{
							client = clientCrud.readById(reservation_individu.getClient_fk_id());
							temoin = true;
						}						
					}
					
					if(!temoin){
						Reservation_groupe reservation_groupe = reservationGroupeCrud.readById(reservation.getReservation_p_id());
						if(reservation_groupe != null){
							groupe = groupeCrud.readById(reservation_groupe.getGroupe_fk_id());
							if(rechercheParClient){
								for(Client aClient : clients){
									if(aClient.getClient_p_id() == groupe.getClient_fk_id()){
										client = aClient;
										break;
									}
								}
							}
							else{
								client = clientCrud.readById(groupe.getClient_fk_id());
							}
						}
					}
					
					vue.addLineToTableReservation(facture.getFacture_p_id(), 
												  reservation.getReservation_debut(), 
												  reservation.getReservation_fin(), 
												  client.getClient_nom(),
												  client.getClient_prenom(),
												  groupe.getGroupe_nom(),
												  reservation.getChambre_fk_id(), 
												  statusChambreCrud.readById(reservation.getStatus_fk_id()).getStatus_description(),
												  reservation.getReservation_commentaire());
				}						
			}			
		}
	};
	
	public static final Message modifier = new Message(){
		public void trigger(Object caster) throws Exception {
			if (!(caster instanceof VueRechercheReservation))
				return;
			
			VueRechercheReservation vue = (VueRechercheReservation)caster;
			vue.clearReservation();
			
			if(!vue.hasRowSelected())
				return;
			
			Language lang = Commander.getInstance().getLanguage();
			VueFacture vueDest = (VueFacture)Commander.getInstance().getVuePrincipale().setSelectedTab(lang.getPrincipaleReception(), 
								  lang.getReceptionFacture());
			
			Connection connection = Commander.getInstance().getConnectionBD();
			
			FactureCrud             factureCrud             = new FactureCrud(connection);			
			ClientCrud              clientCrud              = new ClientCrud(connection);
			GroupeCrud              groupeCrud              = new GroupeCrud(connection);
			ReservationIndividuCrud reservationIndividuCrud = new ReservationIndividuCrud(connection);
			ReservationGroupeCrud   reservationGroupeCrud   = new ReservationGroupeCrud(connection);
			AdresseCrud             adresseCrud             = new AdresseCrud(connection);
			VilleCrud               villeCrud               = new VilleCrud(connection);
			TelephoneCrud           telephoneCrud           = new TelephoneCrud(connection);
			VenteCrud				venteCrud				= new VenteCrud(connection);
			LocationChambreCrud		location_chambreCrud	= new LocationChambreCrud(connection);
			
			int facture_p_id = vue.getSelectedNumeroFacture();

			Facture              facture              = factureCrud.readById(facture_p_id);
			List<Vente>          ventes               = venteCrud.readByfacture_fk(facture_p_id);
			Location_chambre     location_chambre     = location_chambreCrud.readById(ventes.get(0).getVente_p_id());
			Reservation_individu reservation_individu = reservationIndividuCrud.readById(location_chambre.getReservation_fk_id());
			Reservation_groupe   reservation_groupe   = reservationGroupeCrud.readById(location_chambre.getReservation_fk_id());
			
			Reservation reservation = null;
			Client      client      = new Client(0, "", "", 0, "");
			Groupe      groupe      = new Groupe(0, 0, "");

			if(reservation_individu != null){
				client = clientCrud.readById(reservation_individu.getClient_fk_id());
				reservation = reservation_individu;
			}
			else if(reservation_groupe != null){
				groupe = groupeCrud.readById(reservation_groupe.getGroupe_fk_id());
				client = clientCrud.readById(groupe.getClient_fk_id());
				reservation = reservation_groupe;
			}

			Adresse adresse = adresseCrud.readById(client.getAdresse_fk_id());
			Ville   ville   = villeCrud.readById(adresse.getVille_fk_id());
			
			vueDest.setPrenom(client.getClient_prenom());
			vueDest.setTxtNom(client.getClient_nom());
			vueDest.setTxtAdresse(adresse.getadresse_no_rue_app());
			vueDest.setVille(ville.getVille_nom());
			vueDest.setCodePostal(adresseCrud.readById(client.getAdresse_fk_id()).getAdresse_codepostal());
			vueDest.setPays(ville.getVille_pays());
			vueDest.setTelephone(telephoneCrud.readByFk_client(client.getClient_p_id()).get(0).getTelephone_numero());
			vueDest.setAreaParticularite(facture.getFacture_commentaire());

			String[] Data = {reservation.getReservation_debut().toString(), 
					         reservation.getReservation_fin().toString(), 
					         Integer.toString(reservation.getChambre_fk_id()), 
					         "", 
					         "", 
					         "", 
					         "", 
					         ""};
			vueDest.addRowTableReservation(Data);
		}
	};
}
	
	
