/*
 *  Copyright 2013-2050 Emmanuel BRUN (contact@amapj.fr)
 * 
 *  This file is part of AmapJ.
 *  
 *  AmapJ is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU Affero General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.

 *  AmapJ is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU Affero General Public License for more details.
 *
 *  You should have received a copy of the GNU Affero General Public License
 *  along with AmapJ.  If not, see <http://www.gnu.org/licenses/>.
 * 
 * 
 */
 package fr.amapj.view.views.utilisateur;

import java.util.List;

import com.vaadin.ui.Button;

import fr.amapj.common.SimpleMail;
import fr.amapj.model.models.param.ChoixOuiNon;
import fr.amapj.model.models.param.EtatModule;
import fr.amapj.service.services.authentification.ProcessSetPasswordService;
import fr.amapj.service.services.mesadhesions.AdhesionDTO;
import fr.amapj.service.services.mesadhesions.MesAdhesionDTO;
import fr.amapj.service.services.mesadhesions.MesAdhesionsService;
import fr.amapj.service.services.parametres.ParametresDTO;
import fr.amapj.service.services.parametres.ParametresService;
import fr.amapj.service.services.utilisateur.UtilisateurDTO;
import fr.amapj.service.services.utilisateur.UtilisateurService;
import fr.amapj.service.services.utilisateur.UtilisateurService.UtilisateurInfo;
import fr.amapj.service.services.utilisateur.util.UtilisateurUtil;
import fr.amapj.view.engine.popup.formpopup.WizardFormPopup;
import fr.amapj.view.engine.popup.formpopup.validator.EmailValidator;
import fr.amapj.view.engine.popup.formpopup.validator.IValidator;
import fr.amapj.view.engine.popup.formpopup.validator.NotNullValidator;
import fr.amapj.view.engine.popup.mailpopup.SaisieMailContentPopup;
import fr.amapj.view.engine.widgets.CurrencyTextFieldConverter;
import fr.amapj.view.views.importdonnees.UtilisateurImporter;

/**
 * Permet de creer les utilisateurs
 */
public class CreationUtilisateurEditorPart extends WizardFormPopup
{

	private UtilisateurDTO utilisateurDTO;

	private boolean sendMail;

	private ParametresDTO parametresGen;

	private UtilisateurInfo info;
	
	private SimpleMail mailContent;

	/**
	 * 
	 */
	public CreationUtilisateurEditorPart()
	{
		setWidth(80);
		popupTitle = "Création d'un utilisateur";

		utilisateurDTO = new UtilisateurDTO();
		utilisateurDTO.visibleEcranListeAdherent = ChoixOuiNon.NON;
		setModel(utilisateurDTO);
		
		saveButtonTitle = "OK";
		parametresGen = new ParametresService().getParametres();
		mailContent = new ProcessSetPasswordService().getInitialMailBienvenue();

	}
	
	@Override
	protected void configure()
	{
		add(()->addFieldSaisie(),()->checkSaisie());
		add(()->addFieldEnvoi(),()->doEnvoi());
		add(()->addFieldComplements());
		
	}

	private void addFieldSaisie()
	{
		IValidator notNull = new NotNullValidator();
		IValidator email = new EmailValidator();
		
		
		// Titre
		setStepTitle("les informations du nouvel utilisateur");
		
		// Champ 1
		addTextField("Nom", "nom",notNull);

		// Champ 2
		addTextField("Prenom", "prenom",notNull);

		// Champ 3
		addTextField("E mail", "email",email);
		
		// Champ 4
		addTextField("Téléphone 1", "numTel1");
		
		// Champ 5
		addTextField("Téléphone 2", "numTel2");

		// Champ 6
		addTextField("Adresse", "libAdr1");
		
		// Champ 7
		addTextField("Code postal", "codePostal");
		
		// Champ 8
		addTextField("Ville", "ville");
	}
	
	private String checkSaisie()
	{
		UtilisateurImporter importer = new UtilisateurImporter();
		List<String> check = importer.checkThisElement(utilisateurDTO);
		
		if (check==null)
		{
			return null;
		}
		
		String err = "Impossible de créer cet utilisateur<br/>"+
					  "Il n'est pas possible de créer cet utilisateur.Raison : <br/>";
		
		for (String str : check)
		{
			err = err + str+"<br/>";
		}
		return err;
	}

	private void addFieldEnvoi()
	{	
		// Titre
		setStepTitle("confirmation avant envoi");
		
		String str = 	"Vous avez demandé à créer un nouvel utilisateur.<br/><br/>"+
						"Nom = <b>"+utilisateurDTO.nom+"</b><br/>"+
						"Prenom= <b>"+utilisateurDTO.prenom+"</b><br/>"+
						"E mail = <b>"+utilisateurDTO.email+"</b><br/>";
		
		addHtml(str);
		
		
		
		if (UtilisateurUtil.canSendMailTo(utilisateurDTO.email)==false)
		{
			sendMail = false;
			addHtml("Cet utilisateur n'a pas d'email , il n'aura pas de mot de passe, mais les référents et les trésoriers pourront néanmoins saisir ses contrats.");
		}
		else
		{
			sendMail = true;
			addHtml("Un e mail va être automatiquement envoyé à l'utilisateur, un lien de cet email permettra à l'utilisateur de créer son mot de passe.<br/>"+
					"Vous pouvez voir / modifier le mail qui va être envoyé en cliquant sur le bouton ci dessous.");
			
			Button btn = new Button("Voir / Modifier le contenu du mail qui sera envoyé");
			btn.addClickListener(e->new SaisieMailContentPopup("Voir / Modifier le contenu du mail envoyé",mailContent).open());
			form.addComponent(btn);

		}
		
		addHtml("Cliquez ensuite sur Etape Suivante pour terminer la création de l'utilisateur, ou Annuler pour ne rien faire");
	}
	 
	
	private String doEnvoi()
	{
		if (sendMail)
		{
			info = new UtilisateurService().createNewUser(utilisateurDTO,mailContent.title,mailContent.content);
		}
		else
		{
			info = new UtilisateurService().createNewUser(utilisateurDTO,null,null);
		}
		return null;
	}
	
	
	private void addFieldComplements()
	{	
		// Titre
		setStepTitle("compléments sur cet utilisateur");
		
		addHtml("L'utilisateur "+utilisateurDTO.nom+" "+utilisateurDTO.prenom+" a été créé avec succés.</br>");		
		
		if (sendMail)
		{
			addHtml("Le mail permettant la création du mot de passe a bien été envoyé directement à l'utilisateur</br>");
		}
		
		addHtml("</br><br/>");
		
		// 
		if (parametresGen.etatGestionCotisation==EtatModule.ACTIF)
		{
			String str = findAdhesion();
			if (str!=null)
			{
				addHtml("<b>Vous avez créé une adhésion pour cet utilisateur : "+str+"</b>");
			}
			else
			{
				addHtml("Vous pouvez maintenant compléter en enregistrant tout de suite l'adhésion de cet utilisateur.</br>");
			
				Button b = new Button("Enregistrer l'adhésion", e->handleAdhesion());
				form.addComponent(b);
			}
		}
		
		setAllButtonsAsOK();
	}

	private void handleAdhesion() 
	{
		new CreationUtilisateurAjoutCotisation(info.id).open(()->addFieldComplements());
	}
	
	private String findAdhesion() 
	{
		MesAdhesionDTO adhs = new MesAdhesionsService().computeAdhesionInfo(info.id);
		if (adhs.enCours.size()!=0)
		{
			AdhesionDTO adh = adhs.enCours.get(0);
			return "Période :"+adh.nomPeriode+" Montant : "+new CurrencyTextFieldConverter().convertToString(adh.montantAdhesion)+" €";
		}
		
		return null;
	}

	@Override
	protected void performSauvegarder()
	{
		// Nothing to do
	}
}
