package net.sourceforge.fenixedu.presentationTier.Action.person;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sourceforge.fenixedu._development.PropertiesManager;
import net.sourceforge.fenixedu.applicationTier.IUserView;
import net.sourceforge.fenixedu.domain.Person;
import net.sourceforge.fenixedu.presentationTier.Action.base.FenixDispatchAction;
import net.sourceforge.fenixedu.presentationTier.Action.sop.utils.ServiceUtils;

import org.apache.log4j.Logger;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.DynaActionForm;

public class SuggestInstitutionalEmailAction extends FenixDispatchAction {

    private static final String LDAP_USERS_SUFFIX = "ldap.users.suffix";

    private Logger logger = Logger.getLogger(SuggestInstitutionalEmailAction.class);

    public ActionForward edit(ActionMapping mapping, ActionForm form, HttpServletRequest request,
	    HttpServletResponse response) throws Exception {

	IUserView userView = getUserView(request);
	final Person person = userView.getPerson();
	request.setAttribute("person", person);

	setNameAttribute(request, person, person.getGivenNames(), person.getUsedGivenNames(),
		"givenNamesParticules");
	setNameAttribute(request, person, person.getFamilyNames(), person.getUsedFamilyNames(),
		"familyNamesParticules");

	final String institutionalEmail = person.getUsedName().trim().replace(" ", "_")
		+ PropertiesManager.getProperty(LDAP_USERS_SUFFIX);
	request.setAttribute("suggestedInstitutionalEmail", institutionalEmail);

	return mapping.findForward("edit");
    }

    public ActionForward changeGivenNamesAndFamilyNames(ActionMapping mapping, ActionForm form,
	    HttpServletRequest request, HttpServletResponse response) throws Exception {

	DynaActionForm suggestPersonalEmailForm = (DynaActionForm) form;

	final String givenNames = suggestPersonalEmailForm.getString("givenNames").trim();
	final String familyNames = suggestPersonalEmailForm.getString("familyNames").trim();

	final String givenNamesPlusFamilyNames = givenNames + " " + familyNames;

	// Validations:
	if (!suggestPersonalEmailForm.getString("name").equals(givenNamesPlusFamilyNames)) {
	    logger.info("The full name must be equal to the given names + family names");
	    addActionMessage(request, "error.givenNames.plus.familyNames.not.equal.to.full.name");
	}

	final IUserView userView = getUserView(request);
	final Object[] args = new Object[] { userView, givenNames.trim(), familyNames.trim() };
	ServiceUtils.executeService(userView, "ChangeGivenNamesAndFamilyNames", args);

	return edit(mapping, form, request, response);
    }

    @SuppressWarnings("unchecked")
    public ActionForward success(ActionMapping mapping, ActionForm form, HttpServletRequest request,
	    HttpServletResponse response) throws Exception {

	if (getActionMessages(request).isEmpty()) {
	    final StringBuilder usedGivenNames = new StringBuilder();
	    final int numberOfGivenNameParticules = Integer.valueOf(request
		    .getParameter("givenNameParticuleIndex"));

	    for (int i = 0; i != numberOfGivenNameParticules; i++) {
		final String name = request.getParameter("givenNameParticule" + i);
		if (request.getParameter("givenNameParticuleChecked" + i) != null) {
		    usedGivenNames.append(name).append(" ");
		}
	    }

	    final StringBuilder usedFamilyNames = new StringBuilder();
	    final int numberOfFamilyNameParticules = Integer.valueOf(request
		    .getParameter("familyNameParticuleIndex"));

	    for (int i = 0; i != numberOfFamilyNameParticules; i++) {
		final String name = request.getParameter("familyNameParticule" + i);
		if (request.getParameter("familyNameParticuleChecked" + i) != null) {
		    usedFamilyNames.append(name).append(" ");
		}
	    }

	    final Object[] args = new Object[] { getUserView(request), usedGivenNames.toString().trim(),
		    usedFamilyNames.toString().trim() };

	    ServiceUtils.executeService(getUserView(request), "ChangeUsedGivenNamesAndUsedFamilyNames",
		    args);
	    addActionMessage(request, "label.success");
	}

	return edit(mapping, form, request, response);
    }

    private void setNameAttribute(HttpServletRequest request, final Person person, final String name,
	    final String usedName, final String attributeName) {
	if (name != null) {
	    final List<UsedNameBean> result = new ArrayList<UsedNameBean>();
	    final List<String> namesParticules = Arrays.asList(name.split(" "));
	    for (final String particule : namesParticules) {
		if (usedName.contains(particule)) {
		    result.add(new UsedNameBean(particule, true));
		} else {
		    result.add(new UsedNameBean(particule, false));
		}
	    }
	    request.setAttribute(attributeName, result);
	}
    }
}