package controler.client;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

import language.Language;
import tool.regEx.Adresse;
import view.vueAjoutClient.AjoutClient;
import view.vueAjoutClient.ModifierClient;

import commander.Commander;

import controler.Message;
import database.crud.AdresseCrud;
import database.crud.ClientCrud;
import database.crud.GroupeCrud;
import database.crud.TelephoneCrud;
import database.crud.VilleCrud;
import database.dataset.Client;
import database.dataset.Groupe;
import database.dataset.Telephone;
import database.dataset.Ville;

public class ControlerAjoutClient {

	public static final Message reveil = new Message(){
		public void trigger(Object caster) throws Exception {
			if (!(caster instanceof AjoutClient))
				return;
			//AjoutClient vue = (AjoutClient)caster;

		}
	};
	
	public static final Message choisirVille = new Message(){
		@Override
		public void trigger(Object caster) throws SQLException, Exception {
			Language lang = Commander.getInstance().getLanguage();
			Commander.getInstance().getVuePrincipale().setSelectedTab(lang.getPrincipaleRecherche(), lang.getRecherche_Ville());
		}
	};
	
	public static final Message ajouter = new Message(){
		public void trigger(Object caster) throws Exception {
			//validation que c'est la bonne vue
			if (!(caster instanceof AjoutClient))
				return;
			AjoutClient vue = (AjoutClient)caster;

			//verifier que les champs sont valide
			//setbackground red here
			if (vue.getTxtNom().equals(""))
				return;
			if (vue.getTxtPrenom().equals(""))
				return;
			if (vue.getTxtVille().equals(""))
				return;
			if (vue.getTxtAdresse().equals(""))
				return;
			if (vue.getVille_id()==0)
				return;
			
			//connection à la BD
			Connection connection = Commander.getInstance().getConnectionBD();
			ClientCrud clientCrud = new ClientCrud(connection);
			AdresseCrud adresseCrud = new AdresseCrud(connection);
			VilleCrud villeCrud = new VilleCrud(connection);
			TelephoneCrud telephoneCrud = new TelephoneCrud(connection);
			GroupeCrud groupeCrud = new GroupeCrud(connection);
			
			//aquisition de données
			String prenom = vue.getTxtPrenom();
			String nom = vue.getTxtNom();
			String adresse = vue.getTxtAdresse();
			String codepostal = vue.getCodePostal();
			String commentaire = vue.getAreaParticularite();

			//requete
			int ville_id = vue.getVille_id();	
			//insertion adresse
			Adresse adresseData = new Adresse(adresseCrud.getNewSequenceId(), 
											  adresse, 
											  ville_id, 
											  codepostal);
			int adresse_id = adresseCrud.create(adresseData);
			
			//insertion client
			connection.setAutoCommit(false);
			Client clientData = new Client(clientCrud.getNewSequenceId(), 
					                       nom, 
					                       prenom, 
					                       adresse_id, 
					                       commentaire);
			int client_id = clientCrud.create(clientData);
			connection.commit();
			connection.setAutoCommit(true);
			
			//telephone
			for (int i=0;i<vue.getCountTelephone();i++){
				Telephone telephoneData = new Telephone(telephoneCrud.getNewSequenceId(), 
						                                1,   /*toujours maison*/
						                                vue.getTelephoneAt(i), 
						                                client_id);
				telephoneCrud.create(telephoneData);
			}
			
			//groupe
			for (int i=0;i<vue.getCountGroupe();i++){
				Groupe groupeData = new Groupe(groupeCrud.getNewSequenceId(),
						                       client_id, 
						                       vue.getGroupeAt(i));
				groupeCrud.create(groupeData);
			}
			
			//transport vers modifier
			Language lang = Commander.getInstance().getLanguage();
			ModifierClient vueDest = (ModifierClient)Commander.getInstance().getVuePrincipale().setSelectedTab(lang.getPrincipaleReception(), lang.getReceptionClientModifier());
			
			//prendre les données dans la BD
			Client clientLu = clientCrud.readById(client_id);
			Adresse adresseLu = adresseCrud.readById(clientLu.getAdresse_fk_id());
			Ville villeLu = villeCrud.readById(adresseLu.getVille_fk_id());
			List<Groupe> groupeLu = groupeCrud.readByFk_client(client_id);
			List<Telephone> telephoneLu = telephoneCrud.readByFk_client(client_id);
			
			//bricoler les données
			String[] groupeArr = new String[groupeLu.size()];
			String[] telephoneArr = new String[telephoneLu.size()];
			for (int i=0; i< telephoneLu.size();i++)
				telephoneArr[i]=telephoneLu.get(i).getTelephone_numero();
			for (int i=0;i<groupeLu.size();i++)
				groupeArr[i]=groupeLu.get(i).getGroupe_nom();
				
			//inserer dans la vue
			vueDest.setClient_id(client_id);
			vueDest.setVille_id(ville_id);
			vueDest.addDataToFields(prenom, 
					                nom, 
					                adresse, 
					                codepostal, 
					                vue.getTxtVille(), 
					                telephoneArr, 
					                groupeArr, 
					                commentaire);
			vueDest.setEnabled(true);
		}
	};
	
	public static final Message annuler = new Message(){
		public void trigger(Object caster) throws Exception {
			if (!(caster instanceof AjoutClient))
				return;
			AjoutClient vue = (AjoutClient)caster;
			vue.clearInfo();
		}
	};
}
