package controler.recherche;

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

import language.Language;
import tool.regEx.Adresse;
import view.vueAjoutClient.ModifierClient;
import view.vueFacture.VueFacture;
import view.vueRechercheClient.VueRechercheClient;

import commander.Commander;

import controler.Message;
import database.crud.AdresseCrud;
import database.crud.ClientCrud;
import database.crud.DepotCrud;
import database.crud.FactureCrud;
import database.crud.FermetureCrud;
import database.crud.GroupeCrud;
import database.crud.TaxeCrud;
import database.crud.TelephoneCrud;
import database.crud.VilleCrud;
import database.crud.denormalised.ViewClientCrud;
import database.dataset.Client;
import database.dataset.Depot;
import database.dataset.Facture;
import database.dataset.Fermeture;
import database.dataset.Groupe;
import database.dataset.Telephone;
import database.dataset.Ville;
import database.dataview.view_client;

public class ControlerRechercheClient {
	private ControlerRechercheClient() {}
	
	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 VueRechercheClient))
				return;
			VueRechercheClient vue = (VueRechercheClient)caster;

			TelephoneCrud telephoneCrud = new TelephoneCrud(Commander.getInstance().getConnectionBD());
			ViewClientCrud viewClientCrud = new ViewClientCrud(Commander.getInstance().getConnectionBD());
			
			//formulaire
			String nom = vue.getTextFieldNom();
			String prenom = vue.getTextFieldPrenom();
			String telephone = vue.getTextFieldTelephone();
			String adresse = vue.getTextFieldAdresse();
			
			//requete et peuplement
			vue.clearClient();
			for(view_client client : viewClientCrud.readAllLike(nom, prenom, adresse, "", "", "", "", "", telephone))
			{
				List<Telephone> telephones = telephoneCrud.readByFk_client(client.getClient_p_id());
				vue.addLineToTableClient(client.getClient_p_id(), 
										 client.getClient_nom(), 
										 client.getClient_prenom(), 
										 client.getAdresse_no_rue_app(), 
										 client.getAdresse_codepostal(),
										 client.getVille_nom(), 
										 client.getProvince(), 
										 telephones.get(0).getTelephone_numero());
			}
		}
	};
	
	public static final Message modifier = new Message(){
		public void trigger(Object caster) throws Exception {
			if (!(caster instanceof VueRechercheClient))
				return;
			
			VueRechercheClient vue = (VueRechercheClient)caster;
			
			if(!vue.hasRowSelected())
				return;
			
			Language lang = Commander.getInstance().getLanguage();
			ModifierClient vueDest = (ModifierClient)Commander.getInstance().getVuePrincipale().setSelectedTab(lang.getPrincipaleReception(), lang.getReceptionClientModifier());
			
			Connection connection = Commander.getInstance().getConnectionBD();
			
			GroupeCrud groupeCrud = new GroupeCrud(connection);
			ViewClientCrud viewClientCrud = new ViewClientCrud(connection);
			TelephoneCrud telephoneCrud = new TelephoneCrud(connection);
		
			//formulaire
			int clientID = vue.getSelectedClient();
			
			//requete
			view_client client = viewClientCrud.readById(clientID);
			List<Telephone> telephones = telephoneCrud.readByFk_client(client.getClient_p_id());
			List<Groupe> groupes = groupeCrud.readByFk_client(client.getClient_p_id());

			String [] telephoneStrArr = new String[telephones.size()],
					  groupeStrArr = new String[groupes.size()];
			for (int i=0; i<telephones.size(); i++)
				telephoneStrArr[i] = telephones.get(i).getTelephone_numero();
			for (int i=0; i<groupes.size(); i++)
				groupeStrArr[i] = groupes.get(i).getGroupe_nom();
			
			//destination peuplement
			vueDest.clearInfo();
			vueDest.setClient_id(client.getClient_p_id());
			vueDest.setVille_id(client.getVille_p_id());
			vueDest.addDataToFields(client.getClient_prenom(), 
					                client.getClient_nom(), 
					                client.getAdresse_no_rue_app(), 
					                client.getAdresse_codepostal(), 
					                client.getVille_nom(), 
					                groupeStrArr, 
					                telephoneStrArr, 
					                client.getClient_commentaire()); 
			
			vueDest.setEnabled(true);
		}
	};
	
	public static final Message creerFacture = new Message(){
		public void trigger(Object caster) throws Exception {
			
			VueRechercheClient vue = (VueRechercheClient)caster;
			
			if(!vue.hasRowSelected())
				return;
			Connection connection = Commander.getInstance().getConnectionBD();
			Language lang = Commander.getInstance().getLanguage();
			VueFacture vueDest = (VueFacture)Commander.getInstance().getVuePrincipale().setSelectedTab(lang.getPrincipaleReception(), lang.getReceptionFacture());
		
			GroupeCrud groupeCrud = new GroupeCrud(connection);
			FactureCrud factureCrud = new FactureCrud(connection);
			ViewClientCrud viewclientCrud = new ViewClientCrud(connection);
			TelephoneCrud telephoneCrud = new TelephoneCrud(connection);
			FermetureCrud fermetureCrud = new FermetureCrud(connection);
			TaxeCrud taxeCrud = new TaxeCrud(connection);
			
			//formulaire et requete
			view_client client = viewclientCrud.readById(vue.getSelectedClient());
			List<Telephone> telephone = telephoneCrud.readByFk_client(client.getClient_p_id());

			Facture facture = new Facture(factureCrud.getNewSequenceId(), 
					                      client.getClient_p_id(), 
					                      fermetureCrud.getLastFermeture().getfermeture_p_id(), 
					                      "", 
					                      taxeCrud.readLast().getTaxe_p_id(), 
					                      new Date(System.currentTimeMillis()), 
					                      new Time(System.currentTimeMillis()), 
					                      new BigDecimal(0));
			
			//creation
			factureCrud.create(facture);
			
			//vider les tableaux
			vueDest.ClearTableReservation();
			vueDest.ClearTableVente();
			
			//peuplement destination
			vueDest.setClientId(client.getClient_p_id());
			
			List<Groupe> listGroupe = groupeCrud.readByFk_client(client.getClient_p_id());
			vueDest.setListGroupe(listGroupe);
			vueDest.setPrenom(client.getClient_prenom());
			vueDest.setTxtNom(client.getClient_nom());
			vueDest.setCodePostal(client.getAdresse_codepostal());
			
			for(int i=0;i<telephone.size();i++)
			{
				vueDest.setTelephone(telephone.get(i).getTelephone_numero());
			}
			
			vueDest.setTxtAdresse(client.getAdresse_no_rue_app());
			vueDest.setVille(client.getVille_nom());
			vueDest.setPays(client.getPays());
			vueDest.setProvince(client.getProvince());
			vueDest.setAreaParticularite(facture.getFacture_commentaire());
			vueDest.setAreaCommentaire(client.getClient_commentaire());
			
			vueDest.setFacture_id(facture.getFacture_p_id());

			vueDest.setEnabled(true);
		}
	};
}
