package managedbean.systemAdmin;

import javax.enterprise.context.RequestScoped;
import javax.faces.application.FacesMessage;
import javax.inject.Named;
import javax.servlet.http.HttpSession;

import org.primefaces.PrimeFaces;

import TO.LoggedUserTO;
import managedbean.common.ManagedBeanBase;
import managedbean.common.SessionUtils;

@Named("loginView")
@RequestScoped
public class LoginMBean extends ManagedBeanBase {
	private String username;

	private String password;

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String login() {
		boolean loggedIn = false;
		String viewRedirect = "";

		LoggedUserTO usr = null;

		if (username != null && password != null && username.equals("") == false && password.equals("") == false) {
			try {
				usr = this.getRemoteManagerSystemAdmin().login(username, password);

				if (usr != null) {
					loggedIn = true;
					SessionUtils.createOrUpdateSession(usr);

					this.addFacesMessageKeep(FacesMessage.SEVERITY_INFO, "Login correcto", "Bienvenido " + usr.getName());
					viewRedirect = "/home?faces-redirect=true";
				} else
					this.addFacesMessage(FacesMessage.SEVERITY_WARN, "Login Error", "El usuario o la contraseña son incorrectos");
			} catch (Exception ex) {
				this.addFacesMessage(FacesMessage.SEVERITY_FATAL, "Error fatal", ex.getMessage());
			}

		} else
			this.addFacesMessage(FacesMessage.SEVERITY_WARN, "Login Error", "El usuario o la contraseña son incorrectos");

		PrimeFaces.current().ajax().addCallbackParam("loggedIn", loggedIn);
		return viewRedirect;
	}
	
	/**
	 * Realiza un login semi-automatico. Por ejemplo desde el filtro de autorización.
	 * Se debe utilizar con propositos de depuración, para evitar realizar el login manual.
	 * 
	 * @param ses
	 */
	public boolean autoLogin(HttpSession ses) {
		//TODO: Eliminar este metodo al terminar el desarrollo. 
		boolean bResult = false;
		LoggedUserTO usr = this.getRemoteManagerSystemAdmin().login(username, password);

		if (usr != null) {
			SessionUtils.createOrUpdateSession(ses, usr);
			bResult = true;
		}
		return bResult;
	}

	// logout event, invalidate session
	public String logout() {
		this.addFacesMessageKeep(FacesMessage.SEVERITY_INFO, "Sesión cerrada", "Ha cerrado correctamente su sesión. Hasta la vista");

		SessionUtils.DestroySession();

		return "/home?faces-redirect=true";
	}
}
