/**
 *                                                                            
 * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 *                                                                            
 * All rights reserved. This program and the accompanying materials           
 * are made available under the terms of the Eclipse Public License v1.0       
 * which accompanies this distribution, and is available at                  
 * http://www.eclipse.org/legal/epl-v10.html                                 
 *                                                                            
 * Contributors:   
 * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation 
 */
package org.eclipse.osbp.user;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Hashtable;
import java.util.List;
import java.util.Locale;

import org.eclipse.e4.core.di.extensions.EventUtils;
import org.eclipse.e4.core.services.translation.TranslationService;
import org.eclipse.e4.ui.model.application.MApplication;
import org.eclipse.osbp.ui.api.user.IUser;
import org.eclipse.osbp.ui.api.useraccess.IUserAccessService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.vaadin.server.VaadinSession;

/**
 * The Class User represents the subject currently signed in and carries his
 * data. User can be injected. It conforms the vaaclipse AuthenticationProvider
 * mechanism.
 */
public class User extends Hashtable<String, Object> implements IUser {

	/** The application. */
	private transient MApplication application;
	/** The Constant serialVersionUID. */
	private static final long serialVersionUID = 1L;

	/** The id. */
	private String id;

	/** The user name. */
	private String userName;

	/** The position. */
	private String position;

	/** The perspective. */
	private String perspective;

	/** The extra password. */
	private String extraPassword;

	/** The supervisor. */
	private boolean supervisor;

	/** The email. */
	private String email;

	/** The roles. */
	private Collection<String> roles;

	/** The locale. */
	private Locale locale;

	/** The layouting strategy. */
	private String layoutingStrategy;

	/** The focusing strategy. */
	private String focusingStrategy;

	/** The theme. */
	private String theme;

	/** The print service. */
	private String printService;

	/** The Constant LOGGER. */
	private static final Logger LOGGER = LoggerFactory.getLogger(User.class);

	/** The listeners. */
	private transient List<UserLocaleListener> listeners;
	
	/** The profile image id. */
	private String profileImageId;

	/**
	 * Instantiates a new user.
	 *
	 * @param userName
	 *            the user name
	 */
	/**
	 * @param userName
	 *            the user name
	 */
	public User(String userName) {
		super();
		this.userName = userName;
		if (UserBinder.getUserAccessService() != null) {
			profileImageId = UserBinder.getUserAccessService().getProfileimageId();
			position = UserBinder.getUserAccessService().getPositionName();
			perspective = UserBinder.getUserAccessService().getPerspective();
			extraPassword = UserBinder.getUserAccessService().getExtraPassword();
			supervisor = UserBinder.getUserAccessService().isSupervisor();
			email = UserBinder.getUserAccessService().getEmail();
			roles = UserBinder.getUserAccessService().getRoles();
			id = UserBinder.getUserAccessService().getId();
			layoutingStrategy = UserBinder.getUserAccessService().getLayoutingStrategy();
			focusingStrategy = UserBinder.getUserAccessService().getFocusingStrategy();
			theme = UserBinder.getUserAccessService().getTheme();
			printService = UserBinder.getUserAccessService().getPrintService();
			if (UserBinder.getUserAccessService().getLocaleTag() != null) {
				locale = Locale.forLanguageTag(UserBinder.getUserAccessService().getLocaleTag());
			} else {
				locale = Locale.forLanguageTag("en-US");
			}
		} else {
			locale = Locale.forLanguageTag("en-US");
		}
		put(EventUtils.DATA, this);
		put(userClass, IUser.class);
    	VaadinSession session = VaadinSession.getCurrent();
    	session.setAttribute(IUser.class, this);
		LOGGER.debug("User is initialized");
	}

	/**
	 * Gets the layouting strategy.
	 *
	 * @return the layouting strategy
	 */
	public String getLayoutingStrategy() {
		return layoutingStrategy;
	}

	/**
	 * Gets the focusing strategy.
	 *
	 * @return the focusing strategy
	 */
	public String getFocusingStrategy() {
		return focusingStrategy;
	}

	/**
	 * Gets the theme.
	 *
	 * @return the theme
	 */
	public String getTheme() {
		return theme;
	}

	/**
	 * Gets the print service.
	 *
	 * @return the print service
	 */
	public String getPrintService() {
		return printService;
	}

	/**
	 * Sets the print service.
	 *
	 * @param printService
	 *            the new print service
	 */
	public void setPrintService(String printService) {
		this.printService = printService;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.eclipse.osbp.vaaclipse.publicapi.authentication.IUser#getUserName()
	 */
	public String getUserName() {
		return userName;
	}

	/**
	 * Sets the user name.
	 *
	 * @param userName
	 *            the new user name
	 */
	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getProfileImageId() {
		return profileImageId;
	}

	/**
	 * Gets the id.
	 *
	 * @return the id
	 */
	public String getId() {
		return id;
	}

	/**
	 * Gets the position.
	 *
	 * @return the position
	 */
	public String getPosition() {
		return position;
	}

	/**
	 * Gets the extra password.
	 *
	 * @return the extra password
	 */
	public String getExtraPassword() {
		return extraPassword;
	}

	/**
	 * Gets the supervisor.
	 *
	 * @return the supervisor
	 */
	public boolean isSupervisor() {
		return supervisor;
	}

	/**
	 * Gets the perspective id.
	 *
	 * @return the perspective id
	 */
	public String getPerspective() {
		return perspective;
	}

	/**
	 * Gets the email.
	 *
	 * @return the email
	 */
	public String getEmail() {
		return email;
	}

	/**
	 * Gets the roles.
	 *
	 * @return the roles
	 */
	public Collection<String> getRoles() {
		return roles;
	}

	/**
	 * Gets the locale.
	 *
	 * @return the locale
	 */
	public Locale getLocale() {
		return locale;
	}

	/**
	 * Sets the locale.
	 *
	 * @param locale
	 *            the new locale
	 */
	public void setLocale(Locale locale) {
		this.locale = locale;
		// force e4 application to switch locale and update localization
		if (application != null) {
			application.getContext().set(TranslationService.LOCALE, locale);
			ApplicationLocalization.updateLocalization(application);
		}
		Locale.setDefault(locale);
		notifyUserLocaleChanged(locale);
	}

	/**
	 * Gets the user access service.
	 *
	 * @return the user access service
	 */
	public IUserAccessService getUserAccessService() {
		return UserBinder.getUserAccessService();
	}

	@Override
	public void addUserLocaleListener(UserLocaleListener listener) {
		if (listeners == null) {
			listeners = new ArrayList<>();
		}

		if (!listeners.contains(listener)) {
			listeners.add(listener);
			if (locale != null) {
				listener.localeChanged(locale);
			}
		}
	}

	@Override
	public void removeUserLocaleListener(UserLocaleListener listener) {
		if (listeners == null) {
			return;
		}

		listeners.remove(listener);
	}

	@Override
	public void notifyUserLocaleChanged(Locale locale) {
		if (listeners == null) {
			return;
		}

		for (UserLocaleListener listener : listeners.toArray(new UserLocaleListener[listeners.size()])) {
			listener.localeChanged(locale);
		}
	}

	@Override
	public void setApplication(MApplication application) {
		this.application = application;
		setLocale(locale);
	}
}
