/*
 *  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 com.vaadin.server.Sizeable.Unit;
import com.vaadin.ui.Button;
import com.vaadin.ui.CheckBox;
import com.vaadin.ui.HorizontalLayout;

import fr.amapj.common.CollectionUtils;
import fr.amapj.common.SimpleMail;
import fr.amapj.service.services.authentification.ProcessSetPasswordService;
import fr.amapj.service.services.utilisateur.envoimail.EnvoiMailDTO;
import fr.amapj.service.services.utilisateur.envoimail.EnvoiMailUtilisateurDTO;
import fr.amapj.service.services.utilisateur.envoimail.StatusEnvoiMailDTO;
import fr.amapj.view.engine.popup.formpopup.WizardFormPopup;
import fr.amapj.view.engine.popup.formpopup.validator.StringLengthValidator;
import fr.amapj.view.engine.tools.table.complex.ComplexTableBuilder;

/**
 * Popup 
 * 
 *
 */
public class PopupEnvoiPasswordMasse extends WizardFormPopup
{

	private EnvoiMailDTO envoiMail;
	
	private ComplexTableBuilder<EnvoiMailUtilisateurDTO> builder;

	/**
	 * 
	 */
	public PopupEnvoiPasswordMasse()
	{
		setWidth(80);
		popupTitle = "Envoi des mails de bienvenue en masse";
		saveButtonTitle = "Quitter";

		// 
		envoiMail = new ProcessSetPasswordService().getEnvoiMailDTO();
		
		SimpleMail s = new ProcessSetPasswordService().getInitialMailBienvenue();
		envoiMail.mailTitle = s.title; 
		envoiMail.mailContent = s.content;
		
		setModel(envoiMail);

	}
	
	@Override
	protected void configure()
	{
		add(()->addFieldInfoGenerales());
		add(()->addFieldUtilisateurs(),()->checkUtilisateurs());
		add(()->addFieldTexteMail());
		add(()->addFieldAvertissement());
		add(()->addFieldResultat());
	}

	

	private void addFieldInfoGenerales()
	{
		// Titre
		setStepTitle("les informations générales.");
		
		String str = 	"Cet outil va vous permettre d'envoyer un mail de bienvenue avec un lien pour créer son mot de passe</br>"+
						"à tous les utilisateurs nouvellement créés ou à ceux qui ne se sont jamais connectés.<br/><br/>"+
						"Sur l'écran suivant, vous allez visualiser la liste des personnes qui vont recevoir ce message <br/><br/>"+
						"Sur l'écran encore suivant, vous pourrez saisir le texte du message qui sera envoyé<br/>";
				
		
		addHtml(str);
		

	}
	
	

	private void addFieldUtilisateurs()
	{
		// Titre
		setStepTitle("les utilisateurs qui vont recevoir le mail de bienvenue");
		
		//	
		builder = new ComplexTableBuilder<EnvoiMailUtilisateurDTO>(envoiMail.utilisateurs);
		builder.setPageLength(20);
		
		builder.addString("Nom", false, 150, e->e.nom);
		builder.addString("Prénom", false, 150,  e->e.prenom);
		builder.addString("Détails", false, 300,  e->e.dateEnvoiMail);
		
		builder.addCheckBox("Envoyer un mail de bienvenue", "cb",true, 150, e->e.sendMail, null);
		
		addComplexTable(builder);
		
		Button b1 = new Button("Tout cocher",e->handleCocher(true));
		Button b2 = new Button("Tout décocher",e->handleCocher(false));
		HorizontalLayout hl = new HorizontalLayout();
		hl.addComponent(b1);
		hl.addComponent(b2);
		form.addComponent(hl);
	}
	
	private void handleCocher(boolean val) 
	{
		for (int i = 0; i < envoiMail.utilisateurs.size(); i++)
		{ 
			CheckBox cb = (CheckBox) builder.getComponent(i, "cb");	
			cb.setValue(val);
		}
	}
	
	private String checkUtilisateurs() 
	{
		// Copie dans le modele
		for (int i = 0; i < envoiMail.utilisateurs.size(); i++)
		{ 
			CheckBox cb = (CheckBox) builder.getComponent(i, "cb");	
			envoiMail.utilisateurs.get(i).sendMail = cb.getValue();
		}
		
		// 
		if (CollectionUtils.count(envoiMail.utilisateurs, e->e.sendMail)==0)
		{
			return "Vous devez sélectionner au moins un utilisateur";
		}
		
		
		return null;
	}

	
	
	private void addFieldTexteMail()
	{
		// Titre
		setStepTitle("le mail de bienvenue");
		
		//
		addTextField("Titre du mail", "mailTitle",new StringLengthValidator(1,500));
		
		addCKEditorFieldForLabel("Contenu du mail", "mailContent").setHeight(8,Unit.CM); 
		
	}
	
	
	private void addFieldAvertissement()
	{
		// Titre
		setStepTitle("Etes vous sûr ? ");
		
		long count=envoiMail.utilisateurs.stream().filter(e->e.sendMail).count();
		
		String str = 	"Vous allez envoyer "+count+" mails.</br>"+
						"Etes vous sûr de vouloir continuer ?<br/>"+
						"Quand vous allez cliquer sur Etape suivante, les mails seront envoyés<br/>";
				
		addHtml(str);
	}
	
	
	private void addFieldResultat()
	{
		StatusEnvoiMailDTO ret = new ProcessSetPasswordService().envoiEmailBienvenue(envoiMail);
		
		
		// Titre
		setStepTitle("Résultats");
		
		String str = 	ret.nbMailOK+" mails ont été envoyés avec succés";
		addHtml(str);
		
		
		if (ret.erreurs.size()>0)
		{
			str = 	"Il y a eu "+ret.erreurs.size()+" erreurs.</br></br>";
			for (String err : ret.erreurs)
			{
				str = str+err+"</br>";
			}
			addHtml(str);
		}
		
		previousButton.setEnabled(false);
		
	}


	

	@Override
	protected void performSauvegarder()
	{
		
	}
}
