package controler.plan;

import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.Date;
import java.sql.Time;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import javax.swing.JOptionPane;

import language.Language;
import view.vueFacture.VueFacture;
import view.vueSelectorDateChambre.SelecteurDateChambre;

import com.ibm.icu.util.Calendar;
import commander.Commander;

import controler.Message;
import database.crud.ArticleCrud;
import database.crud.ChambreCrud;
import database.crud.ClientCrud;
import database.crud.GroupeCrud;
import database.crud.ReservationCrudGeneral;
import database.crud.vente.LocationChambreCrud;
import database.crud.vente.VenteCrud;
import database.dataset.Article;
import database.dataset.Chambre;
import database.dataset.Client;
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;

public class ControlerPlan {
	public static final Message reveil = new Message(){
		public void trigger(Object caster) throws Exception {
			if (!(caster instanceof SelecteurDateChambre))
				return;
			SelecteurDateChambre vue = (SelecteurDateChambre)caster;
			Date debut = vue.getDebut(),
				 fin = vue.getFin();
			
			Connection connection = Commander.getInstance().getConnectionBD();
			
			ChambreCrud chambreCrud = new ChambreCrud(connection);
			ClientCrud clientCrud = new ClientCrud(connection);
			GroupeCrud groupeCrud = new GroupeCrud(connection);
			ReservationCrudGeneral reservationCrud = new ReservationCrudGeneral(connection);

			
			List<Chambre> chambres = chambreCrud.readAll();
			HashMap<Integer, List<Date>> hashMapSelectedDate = new HashMap<Integer, List<Date>>();
			
			for(Chambre chambre : chambres)
			{
				hashMapSelectedDate.put(chambre.getChambre_p_id(), vue.getSelectedDateForChambre(chambre.getChambre_p_id()));
			}
			
			vue.clearChambre();
			
			for (Chambre chambre : chambres){
				List<Reservation> reservations= reservationCrud.readAllLike(chambre.getChambre_numero(), debut, fin);
				
				if (reservations.size()==0)
					/*vue.addChambre(chambre, "nb:", ""+reservations.size(), debut, 1);*/
					vue.addChambre(chambre, "", "", null, 1);
				else{
					Reservation reservation = reservations.get(0);
				
					if (reservation instanceof Reservation_groupe){
						Reservation_groupe reservationGroupe = (Reservation_groupe)reservation;
						Groupe groupe = groupeCrud.readById(reservationGroupe.getGroupe_fk_id());
						vue.addChambre(chambre, 
							           groupe.getGroupe_nom(),
							           "groupe",
							           //reservationGroupe.getReservation_fin(), 
							           null,
							           reservationGroupe.getStatus_fk_id());
					}else if (reservation instanceof Reservation_individu){
						Reservation_individu reservationIndividu = (Reservation_individu)reservation;
						Client client = clientCrud.readById(reservationIndividu.getClient_fk_id());
						vue.addChambre(chambre, 
						           client.getClient_nom(),
						           client.getClient_prenom(),
						           //reservationIndividu.getReservation_fin(), 
						           null,
						           reservationIndividu.getStatus_fk_id());
					}else{
						vue.addChambre(chambre, 
							           "autre",
							           "",
							           //reservation.getReservation_fin(), 
							           null,
							           reservation.getStatus_fk_id());
					}
				}
				vue.setSelectedDateForChambre(chambre.getChambre_p_id(),hashMapSelectedDate.get(chambre.getChambre_p_id()));
			}
		}
	};
	

	public static final Message ajouter = new Message(){
		public void trigger(Object caster) throws Exception {
			if (!(caster instanceof SelecteurDateChambre))
				return;

			SelecteurDateChambre vue = (SelecteurDateChambre)caster;
			Language lang = Commander.getInstance().getLanguage();
			
			VueFacture vueDest = (VueFacture)Commander.getInstance().getVuePrincipale().setSelectedTab(lang.getPrincipaleReception(), lang.getReceptionFacture());
			Connection connection = Commander.getInstance().getConnectionBD();
			
			ChambreCrud chambreCrud = new ChambreCrud(connection);
			LocationChambreCrud locationChambreCrud = new LocationChambreCrud(connection);
			ReservationCrudGeneral reservationCrud = new ReservationCrudGeneral(connection);
			VenteCrud venteCrud = new VenteCrud(connection);
			ArticleCrud articleCrud = new ArticleCrud(connection);
			
			List<Date> dates = new ArrayList<Date>();
			List<Chambre> chambres = chambreCrud.readAll();
			List<Chambre> chambresLibre = new ArrayList<Chambre>();
			
			List<Reservation> nouvelleReservation = new ArrayList<Reservation>();
			List<Location_chambre> nouvelleLocationChambre = new ArrayList<Location_chambre>();
			
			Chambre chambreNumero;
			Location_chambre locationChambre;
			Reservation reservation;
			
			Date debut,
				 fin;
			
			for(Chambre chambre : chambres)
			{
				dates = vue.getSelectedDateForChambre(chambre.getChambre_p_id());
				for(int i=0;i<dates.size();i++)
				{
					debut = dates.get(i);
					
					Calendar cal = Calendar.getInstance(); 
					cal.setTime(dates.get(i)); 
					cal.add(Calendar.DATE, 1);
					
					while(i<dates.size())
					{
						chambresLibre = chambreCrud.readAllLike("", "", "", dates.get(i).toString(), dates.get(i).toString());
						List<Integer> numeroChambreLibre = new ArrayList<Integer>();
						for(Chambre chambreLibre : chambresLibre)
						{
							numeroChambreLibre.add(chambreLibre.getChambre_numero());
						}
						
						if(!numeroChambreLibre.contains(chambre.getChambre_numero()))
						{
							JOptionPane.showMessageDialog(null, "Une chambre est déjà réservé pour la selection que vous avez faites");
							return;
						}
						
						if(i+1<dates.size())
						{
							if((dates.get(i+1).toString().equals(new Date(cal.getTimeInMillis()).toString())))
							{
								i++;
								cal.setTime(dates.get(i)); 
								cal.add(Calendar.DATE, 1);
							}
							else
							{
								break;
							}
						}
						else
						{
							break;
						}
					}
					
					fin = dates.get(i);
					
					reservation = new Reservation(reservationCrud.getNewSequenceId(), chambre.getChambre_p_id(), debut, fin, "", 2);
					locationChambre = new Location_chambre(venteCrud.getNewSequenceId(), new Date(System.currentTimeMillis()), new Time(System.currentTimeMillis()), new BigDecimal(0), vueDest.getFacture_id(), 1, reservation.getReservation_p_id());
					
					nouvelleReservation.add(reservation);
					nouvelleLocationChambre.add(locationChambre);
					//reservationCrud.create(reservation);
					//locationChambreCrud.create(locationChambre);
					
					List<Article> articleIndividuel = articleCrud.readByFk_categorie(1);
					List<Article> articleGroupe = articleCrud.readByFk_categorie(2);
					
					List<Article> articleAll = new ArrayList<Article>();
					
					for(int a=0;a<articleIndividuel.size();a++)
					{
						if(articleIndividuel.get(a).isArticle_actif())
						{
							articleAll.add(articleIndividuel.get(a));
						}				
					}
					
					for(int b=0;b<articleGroupe.size();b++)
					{
						if(articleGroupe.get(b).isArticle_actif())
						{
							articleAll.add(articleGroupe.get(b));
						}
					}
					
					
					chambreNumero = chambreCrud.readById(reservation.getChambre_fk_id());
					vueDest.add_ReservationId(reservation.getReservation_p_id());
					vueDest.add_ReservationVenteId(locationChambre.getVente_p_id());
					vueDest.addRowTableReservation(new String[]{reservation.getReservation_debut().toString(), 
																reservation.getReservation_fin().toString(),
																String.valueOf(chambreNumero.getChambre_numero()),
																articleAll.get(0).getArticle_code()});
					
					for(int a=0;a<articleAll.size();a++)
					{
						vueDest.addPromotionValueAtTableReservation(vueDest.getSize_ReservationVenteId()-1, articleAll.get(a).getArticle_code());
					}
				}
			}
			for(Reservation une_reservation : nouvelleReservation)
				reservationCrud.create(une_reservation);
			for(Location_chambre une_location_chambre : nouvelleLocationChambre)
				locationChambreCrud.create(une_location_chambre);

		}
	};
	

	public static final Message selectionnerClient = new Message(){
		public void trigger(Object caster) throws Exception {
			if (!(caster instanceof SelecteurDateChambre))
				return;
			SelecteurDateChambre vue = (SelecteurDateChambre)caster;
			Connection connection = Commander.getInstance().getConnectionBD();
			Language lang = Commander.getInstance().getLanguage();

			Commander.getInstance().getVuePrincipale().setSelectedTab(lang.getPrincipaleRecherche(), lang.getRechercheClient());
			//vueDest.setEnabled(true);
		}
	};
}
