package controler.client;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
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 ControlerModifierClient {

	public static final Message reveil = new Message(){
		public void trigger(Object caster) throws Exception {
			if (!(caster instanceof AjoutClient))
				return;
			ModifierClient vue = (ModifierClient)caster;
			
			if(vue.getVille_id() == 0 || vue.getClient_id() == 0)
			{
				vue.DisableModification();
			}
			else
			{
				vue.AbleModification();
			}
			//Connection connection = Commander.getInstance().getConnectionBD();
		}
	};
	
	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 enregistrer = new Message(){
		public void trigger(Object caster) throws Exception {
			//verifier que c'est la bonne vue
			if (!(caster instanceof ModifierClient))
				return;
			ModifierClient vue = (ModifierClient)caster;
			if (vue.getClient_id() == 0)
				return;
			
			//validation des entrées
			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 avec la BD
			Connection connection = Commander.getInstance().getConnectionBD();
			Language lang = Commander.getInstance().getLanguage();
			Commander.getInstance().getVuePrincipale().setModifiedTab(lang.getPrincipaleReception(), lang.getReceptionClientModifier(),false);	
			
			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);
			
			//saisie de donnée
			String prenom = vue.getTxtPrenom();
			String nom = vue.getTxtNom();
			String adr = vue.getTxtAdresse();
			String codepostal = vue.getCodePostal();
			String commentaire = vue.getAreaParticularite();
			int ville_id = vue.getVille_id();
			int client_id = vue.getClient_id();
			List<Telephone> newTelephones = new ArrayList<>();
			List<Groupe> newGroupes = new ArrayList<>();
		
			//lecture préliminaire de l'information de la BD
			Client client = clientCrud.readById(client_id);
			Adresse adresse = adresseCrud.readById(client.getAdresse_fk_id());
			List<Telephone> telephones = telephoneCrud.readByFk_client(client.getClient_p_id());
			List<Groupe> groupes = groupeCrud.readByFk_client(client.getClient_p_id());		

			//mise à jour des datasets
			client.setClient_nom(nom);
			client.setClient_prenom(prenom);
			client.setClient_commentaire(commentaire);
			
			List<String> existingTelephone = new ArrayList<String>();
			for(int i = 0; i < telephones.size(); i++)
				existingTelephone.add(telephones.get(i).getTelephone_numero());
			List<String> existingGroupe = new ArrayList<String>();
			for(int i = 0; i < groupes.size(); i++)
				existingGroupe.add(groupes.get(i).getGroupe_nom());
			
			for (int i=0;i<vue.getCountTelephone();i++)
				if (!existingTelephone.contains(vue.getTelephoneAt(i)) && !vue.getTelephoneAt(i).equals(""))
					newTelephones.add(new Telephone(telephoneCrud.getNewSequenceId(), 
							                        1, 
							                        vue.getTelephoneAt(i), 
							                        client_id));
			for (int i=0;i<vue.getCountGroupe();i++)
				if (!existingGroupe.contains(vue.getGroupeAt(i)) && !vue.getGroupeAt(i).equals(""))
					newGroupes.add(new Groupe(groupeCrud.getNewSequenceId(), 
							                  client_id, 
							                  vue.getGroupeAt(i))); 
			
			//enregistrer les changements de la bd
			if (!adresse.getAdresse_codepostal().equals(adr) || 
			    !adresse.getAdresse_codepostal().equals(codepostal) ||
			    adresse.getVille_fk_id()!=ville_id){
				adresse.setadresse_p_id(adresseCrud.getNewSequenceId()); //ajoute nouvelle adresse si différente
				adresse.setadresse_no_rue_app(adr);
				adresse.setAdresse_codepostal(codepostal);
				adresse.setVille_fk_id(ville_id);
				adresseCrud.create(adresse);
				client.setAdresse_fk_id(adresse.getadresse_p_id());
			}
			clientCrud.update(client);
			for (Telephone telephone : newTelephones)
			{
				telephoneCrud.create(telephone);
			}
			for (Groupe groupe : newGroupes)
				groupeCrud.create(groupe);
			
			//afficher les données modifier
			//relecture BD
			client = clientCrud.readById(client_id);
			adresse = adresseCrud.readById(client.getAdresse_fk_id());
			Ville ville = villeCrud.readById(ville_id);
			telephones = telephoneCrud.readByFk_client(client.getClient_p_id());
			groupes = groupeCrud.readByFk_client(client.getClient_p_id());		
			
			//bricoler les données
			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();
			
			vue.clearGroupe();
			vue.clearInfo();
			vue.clearTelephone();
			
			//insertion dans la vue
			vue.addDataToFields(client.getClient_prenom(), 
				                client.getClient_nom(), 
				                adresse.getadresse_no_rue_app(), 
				                adresse.getAdresse_codepostal(), 
				                ville.getVille_nom(), 
				                groupeStrArr, 
				                telephoneStrArr, 
				                client.getClient_commentaire()); 

		}
	};
	
	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();
		}
	};
}
