package bean;

import beans.ClienteFacadeLocal;
import beans.CuentaCorrienteFacadeLocal;
import beans.UsuarioFacadeLocal;
import entities.Cliente;
import entities.CuentaCorriente;
import entities.TarjetaCredito;
import entities.TarjetaDebito;
import entities.Usuario;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;
import javax.faces.context.FacesContext;
import javax.inject.Named;
import utils.Passwords;

@Named(value = "clienteBean")
@SessionScoped
public class ClienteBean implements Serializable {

  @EJB
  private ClienteFacadeLocal clienteFacade;
  @EJB
  private CuentaCorrienteFacadeLocal cuentaCorrienteFacade;
  @EJB
  private UsuarioFacadeLocal usuarioFacade;

  private List<Cliente> clienteList;
  private Cliente cliente;
  private Usuario usuario;

  @PostConstruct
  public void init() {
    this.clienteList = this.clienteFacade.findAll();
    this.cliente = new Cliente();
    this.usuario = new Usuario();
  }

  public String gotoView(Cliente cliente) {
    this.cliente = cliente;
    return "admin_cliente_view";
  }

  public String gotoCreate() {
    this.resetInput();
    return "admin_cliente_create";
  }

  public String create() {
    byte[] salt = Passwords.getNextSalt();
    byte[] hash = Passwords.hash(usuario.getTransientPassword().toCharArray(), salt);

    usuario.setNombre(cliente.getRut());
    usuario.setPassword(hash);
    usuario.setSalt(salt);

    usuarioFacade.create(usuario);

    CuentaCorriente cc = new CuentaCorriente();
    cuentaCorrienteFacade.create(cc);

    cliente.setCuentaCorriente(cc);
    cliente.setUsuario(usuario);
    clienteFacade.create(cliente);

    this.clienteList.add(cliente);

    resetInput();

    return "admin_main";
  }

  public String gotoUpdate(Cliente cliente) {
    this.cliente = cliente;
    this.usuario = cliente.getUsuario();

    return "admin_cliente_edit";
  }

  public String update() {
    if (usuario.getTransientPassword() != null) {
      byte[] salt = Passwords.getNextSalt();
      byte[] hash = Passwords.hash(usuario.getTransientPassword().toCharArray(), salt);

      usuario.setPassword(hash);
      usuario.setSalt(salt);
    }

    usuarioFacade.edit(usuario);
    clienteFacade.edit(cliente);

    this.resetInput();
    return "admin_main";
  }

  public String gotoDelete(Cliente cliente) {
    this.cliente = cliente;
    return "admin_cliente_delete";
  }

  public String delete() {
    this.clienteList.remove(cliente);

    usuarioFacade.remove(cliente.getUsuario());

    this.resetInput();

    return "admin_main";
  }

  public String gotoContratarCuentaCorriente() {
    FacesContext context = FacesContext.getCurrentInstance();
    CuentaCorrienteBean ccb = context.getApplication().evaluateExpressionGet(context, "#{cuentaCorrienteBean}", CuentaCorrienteBean.class);
    ccb.setCliente(cliente);
    return "admin_cuenta_corriente_contratar";
  }

  public String gotoContratarTarjetaCredito() {
    FacesContext context = FacesContext.getCurrentInstance();
    TarjetaCreditoBean tcb = context.getApplication().evaluateExpressionGet(context, "#{tarjetaCreditoBean}", TarjetaCreditoBean.class);
    tcb.setCliente(cliente);
    return "admin_tarjeta_credito_contratar";
  }

  public String gotoContratarTarjetaDebito() {
    FacesContext context = FacesContext.getCurrentInstance();
    TarjetaDebitoBean tdb = context.getApplication().evaluateExpressionGet(context, "#{tarjetaDebitoBean}", TarjetaDebitoBean.class);
    tdb.setCliente(cliente);
    return "admin_tarjeta_debito_contratar";
  }

  public String gotoEditTarjetaCredito() {
    FacesContext context = FacesContext.getCurrentInstance();
    TarjetaCreditoBean tcb = context.getApplication().evaluateExpressionGet(context, "#{tarjetaCreditoBean}", TarjetaCreditoBean.class);
    tcb.setCliente(cliente);
    tcb.setTarjetaCredito(cliente.getTarjetaCredito());
    return "admin_tarjeta_credito_edit";
  }

  public String gotoViewCuentaCorriente() {
    FacesContext context = FacesContext.getCurrentInstance();
    CuentaCorrienteBean ccb = context.getApplication().evaluateExpressionGet(context, "#{cuentaCorrienteBean}", CuentaCorrienteBean.class);
    ccb.setCliente(cliente);
    ccb.setCuentaCorriente(cliente.getCuentaCorriente());
    return "cliente_cuenta_corriente_view";
  }

  public String gotoViewTarjetaDebito() {
    FacesContext context = FacesContext.getCurrentInstance();
    TarjetaDebitoBean tdb = context.getApplication().evaluateExpressionGet(context, "#{tarjetaDebitoBean}", TarjetaDebitoBean.class);
    tdb.setCliente(cliente);
    tdb.setTarjetaDebito(cliente.getTarjetaDebito());
    return "cliente_tarjeta_debito_view";
  }

  public String gotoViewTarjetaCredito() {
    FacesContext context = FacesContext.getCurrentInstance();
    TarjetaCreditoBean tcb = context.getApplication().evaluateExpressionGet(context, "#{tarjetaCreditoBean}", TarjetaCreditoBean.class);
    tcb.setCliente(cliente);
    tcb.setTarjetaCredito(cliente.getTarjetaCredito());
    return "cliente_tarjeta_credito_view";
  }
  
  public String gotoAdminViewCuentaCorriente() {
    FacesContext context = FacesContext.getCurrentInstance();
    CuentaCorrienteBean ccb = context.getApplication().evaluateExpressionGet(context, "#{cuentaCorrienteBean}", CuentaCorrienteBean.class);
    ccb.setCliente(cliente);
    ccb.setCuentaCorriente(cliente.getCuentaCorriente());
    return "admin_cuenta_corriente_view";
  }
  
  public String gotoAdminViewTarjetaDebito() {
    FacesContext context = FacesContext.getCurrentInstance();
    TarjetaDebitoBean tdb = context.getApplication().evaluateExpressionGet(context, "#{tarjetaDebitoBean}", TarjetaDebitoBean.class);
    tdb.setCliente(cliente);
    tdb.setTarjetaDebito(cliente.getTarjetaDebito());
    return "admin_tarjeta_debito_view";
  }


  private void resetInput() {
    this.cliente = new Cliente();
    this.usuario = new Usuario();
  }

  //////////////////////////////////////////////////////////////////////////////
  ///////////////////////////GETTERS Y SETTERS//////////////////////////////////
  //////////////////////////////////////////////////////////////////////////////
  public List<Cliente> getClienteList() {
    return clienteList;
  }

  public void setClienteList(List<Cliente> clienteList) {
    this.clienteList = clienteList;
  }

  public Cliente getCliente() {
    return cliente;
  }

  public void setCliente(Cliente cliente) {
    this.cliente = cliente;
  }

  public Usuario getUsuario() {
    return usuario;
  }

  public void setUsuario(Usuario usuario) {
    this.usuario = usuario;
  }
}
