package bean;

import beans.UsuarioFacadeLocal;
import entities.Usuario;
import java.io.Serializable;
import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Named;
import utils.Passwords;

@Named(value = "userBean")
@SessionScoped
public class UsuarioBean implements Serializable {

  @EJB
  private UsuarioFacadeLocal usuarioFacade;

  private String nombre;
  private String password;

  public String login() {
    Usuario u = usuarioFacade.findByNombre(nombre);
    
    if (u == null) {
      FacesContext context = FacesContext.getCurrentInstance();
      context.addMessage(null, new FacesMessage("El usuario o la contraseña son invalidos"));
      context.validationFailed();
      return "index";
    }

    if (!Passwords.isExpectedPassword(password.toCharArray(), u.getSalt(), u.getPassword())) {
      FacesContext context = FacesContext.getCurrentInstance();
      context.addMessage(null, new FacesMessage("El usuario o la contraseña son invalidos"));
      context.validationFailed();
      return "index";
    }

    this.setUsuario(u);
    
    if(isAdmin())
      return "admin_main";
    if(isClient()){
      FacesContext context = FacesContext.getCurrentInstance();
      ClienteBean clienteBean = context.getApplication().evaluateExpressionGet(context, "#{clienteBean}", ClienteBean.class);
      clienteBean.setCliente(u.getCliente());
      return "cliente_main";
    }
    
    return "error/500";
  }

  public String register() {
    byte[] salt = Passwords.getNextSalt();
    byte[] hash = Passwords.hash(password.toCharArray(), salt);

    Usuario u = new Usuario();
    u.setNombre(nombre);
    u.setPassword(hash);
    u.setSalt(salt);
    u.setRol("Admin");

    usuarioFacade.create(u);

    return "index";
  }

  public String logout() {
    FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
    return "index";
  }

  public boolean isLogged() {
    return this.getUsuario() != null;
  }

  public boolean isAdmin() {
      return this.getUsuario().getRol().equals("Admin");
  }

  public boolean isClient() {
    return this.getUsuario().getRol().equals("Cliente");
  }

  //////////////////////////////////////////////////////////////////////////////
  ///////////////////////////////GETTERS Y SETTERS//////////////////////////////
  //////////////////////////////////////////////////////////////////////////////
  public String getNombre() {
    return nombre;
  }

  public void setNombre(String nombre) {
    this.nombre = nombre;
  }

  public String getPassword() {
    return password;
  }

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

  public Usuario getUsuario() {
    return (Usuario) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuario");
  }

  public void setUsuario(Usuario usuario) {
    FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("usuario", usuario);
  }

}
