/*
 *  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.compte;

import java.util.function.Supplier;

import com.vaadin.ui.Button;
import com.vaadin.ui.FormLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.Panel;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;

import fr.amapj.model.models.param.ChoixOuiNon;
import fr.amapj.model.models.param.paramecran.PEListeAdherent;
import fr.amapj.model.models.param.paramecran.PEListeAdherent.PEListeAdherentAccess;
import fr.amapj.service.services.moncompte.MonCompteService;
import fr.amapj.service.services.parametres.ParametresService;
import fr.amapj.service.services.session.SessionManager;
import fr.amapj.service.services.utilisateur.UtilisateurDTO;
import fr.amapj.service.services.utilisateur.UtilisateurService;
import fr.amapj.view.engine.menu.MenuList;
import fr.amapj.view.engine.popup.corepopup.CorePopup;
import fr.amapj.view.engine.popup.formpopup.FormPopup;
import fr.amapj.view.engine.popup.formpopup.validator.EmailValidator;
import fr.amapj.view.engine.popup.formpopup.validator.NotNullValidator;
import fr.amapj.view.engine.popup.passwordpopup.PasswordPopup;
import fr.amapj.view.engine.template.FrontOfficeView;


/**
 * Page permettant à l'utilisateur de gérer son compte :
 * -> changement de l'adresse e mail 
 * -> changement du mot de passe 
 * -> changement des coordonnées
 *  
 *
 */
public class MonCompteView extends FrontOfficeView 
{
	private FormLayout form1;

	private VerticalLayout vl1;

	private UtilisateurDTO u;
	

	public String getMainStyleName()
	{
		return "moncompte";
	}
	
	/**
	 * 
	 */
	@Override
	public void enter()
	{
		Panel p0 = new Panel();
		p0.setWidth("100%");
		p0.addStyleName("compteform");
		
		vl1 = new VerticalLayout();
		vl1.setMargin(true);
		p0.setContent(vl1);
		addComponent(p0);
		
		form1 = new FormLayout();
        form1.setMargin(false);
        form1.setSpacing(true);
        form1.addStyleName("light");
        vl1.addComponent(form1);
		
		refresh();
	}
	
	private void refresh()
	{
		u = new UtilisateurService().loadUtilisateurDto(SessionManager.getUserId());
		form1.removeAllComponents();

    	// Bloc nom et prenom - Le nom et le prenom ne sont pas modifiables
        addH2("Nom et prénom"); 
		addTextField("Votre nom ",u.nom);
		addTextField("Votre prénom ",u.prenom);
		
		
		// Bloc Adresse mail  
		addH2("Votre mail");
		addTextField("Votre mail",u.email);
		addButton("Modifier votre adresse mail", ()->new SaisieEmailPopup()); 
	    
		
		// Bloc mot de passe
		addH2("Mot de passe");
		addTextField("Votre mot de passe ","***********");
		addButton("Modifier votre mot de passe", ()->new PasswordPopup(u.id, u.email));
		
		// Bloc les coordonnées
		addH2("Vos coordonnées");
		addTextField("Numéro de tel 1",u.numTel1);
		addTextField("Numéro de tel 2",u.numTel2);
		addTextField("Adresse",u.libAdr1);
		addTextField("Code Postal",u.codePostal);
		addTextField("Ville",u.ville);
		addButton("Modifier vos coordonnées", ()->new SaisieCoordonneesPopup());
		
		
		PEListeAdherent pe = (PEListeAdherent) new ParametresService().loadParamEcran(MenuList.LISTE_ADHERENTS);
		if (pe.accesEcran==PEListeAdherentAccess.ALL)
		{
			addH2("Vos préférences");
			addTextField("\"Liste des adhérents\"",u.visibleEcranListeAdherent==ChoixOuiNon.OUI ? "Mon nom est visible" : "Mon nom est masqué");
			addButton("Modifier vos préférences",()->new SaisiePreferencesPopup());
		}		
	}
	
	
	
	// TOOLS	
	private void addH2(String text)
	{
		Label section = new Label(text);
		section.addStyleName("h2");
		section.addStyleName("colored");
	    form1.addComponent(section);
	}
	
	
	private TextField addTextField(String lib,String text)
	{
		TextField name = new TextField(lib);
		name.setValue(text);
		name.addStyleName("compteinput");
		name.setWidth("100%");
		name.setNullRepresentation("");
		name.setReadOnly(true);
		form1.addComponent(name);

		return name;
	}
	

	private void addButton(String text, Supplier<CorePopup> supplierPopup) 
	{
		Button edit = new Button(text,e->supplierPopup.get().open(()->refresh()));
		form1.addComponent(edit);
	}
	
	// Les popups de saisies
	
	public class SaisieEmailPopup extends FormPopup
	{			
		public SaisieEmailPopup()
		{
			popupTitle = "Saisie de votre e mail";
			setWidth(80,450);
			setModel(u);
		}
				
		@Override
		protected void addFields() 
		{	
			addTextField("Votre email", "email",new EmailValidator());
		}
		

		@Override
		protected void performSauvegarder()
		{
			new MonCompteService().setNewEmail(u);
		}

	}
	
	
	public class SaisieCoordonneesPopup extends FormPopup
	{			
		public SaisieCoordonneesPopup()
		{
			popupTitle = "Saisie de vos coordonnées";
			setWidth(80,450);
			setModel(u);
		}
				
		@Override
		protected void addFields() 
		{	
			addTextField("Numéro de tel 1","numTel1");
			addTextField("Numéro de tel 2","numTel2");
			addTextField("Adresse","libAdr1");
			addTextField("Code Postal","codePostal");
			addTextField("Ville","ville");
		}
		

		@Override
		protected void performSauvegarder()
		{
			new MonCompteService().updateCoordoonees(u);
		}

	}
	
	
	public class SaisiePreferencesPopup extends FormPopup
	{			
		public SaisiePreferencesPopup()
		{
			popupTitle = "Saisie de vos préférences";
			setWidth(80,450);
			setModel(u);
		}
				
		@Override
		protected void addFields() 
		{	
			addComboEnumField("Je souhaite apparaitre dans l'écran \"Liste des adhérents\"","visibleEcranListeAdherent", getHelpText(),null,new NotNullValidator());
		}
		

		private String getHelpText() 
		{
			String text = 	"L'écran \"Liste des adhérents\" est accessible à l'ensemble des adhérents.<br/>"+
							"Si vous cochez OUI, alors l'ensemble des adhérents pourront accéder à vos coordonnées (nom, email, téléphone si vous l'avez renseigné)..<br/>"+
							"Si vous cochez NON, alors ces informations seront accessibles uniquement aux référents et trésoriers de l'AMAP.";
			return text;
		}

		@Override
		protected void performSauvegarder()
		{
			new MonCompteService().updatePreference(u);
		}

	}
}
