package controler.plan;

import java.sql.Connection;
import java.sql.Date;
import java.util.HashMap;
import java.util.List;

import view.vueSelectorDateChambre.SelecteurDateChambre;

import commander.Commander;

import controler.Message;
import database.crud.ChambreCrud;
import database.crud.ClientCrud;
import database.crud.GroupeCrud;
import database.crud.ReservationCrudGeneral;
import database.crud.StatusChambreCrud;
import database.crud.reservation.ReservationGroupeCrud;
import database.crud.reservation.ReservationIndividuCrud;
import database.dataset.Chambre;
import database.dataset.Client;
import database.dataset.Groupe;
import database.dataset.Reservation;
import database.dataset.Reservation_groupe;
import database.dataset.Reservation_individu;

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);
			StatusChambreCrud statusCrud = new StatusChambreCrud(connection);
			ReservationCrudGeneral reservationCrud = new ReservationCrudGeneral(connection);
			ReservationGroupeCrud reservationGroupeCrud = new ReservationGroupeCrud(connection);
			ReservationIndividuCrud reservationIndividuCrud = new ReservationIndividuCrud(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);
				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(), 
							           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(), 
						           reservationIndividu.getStatus_fk_id());
					}else{
						vue.addChambre(chambre, 
							           "autre",
							           "",
							           reservation.getReservation_fin(), 
							           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;
				Connection connection = Commander.getInstance().getConnectionBD();

		}
	};
	

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

		}
	};
}
