package bean;

import beans.CompraTarjetaCreditoFacadeLocal;
import beans.CompraTarjetaDebitoFacadeLocal;
import beans.TarjetaCreditoFacadeLocal;
import beans.TarjetaDebitoFacadeLocal;
import entities.CompraTarjetaCredito;
import entities.CompraTarjetaDebito;
import entities.TarjetaCredito;
import entities.TarjetaDebito;
import java.io.Serializable;
import java.util.Date;
import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Named;

@Named(value = "compraBean")
@SessionScoped
public class CompraBean implements Serializable {

  @EJB
  private CompraTarjetaCreditoFacadeLocal compraTarjetaCreditoFacade;
  @EJB
  private CompraTarjetaDebitoFacadeLocal compraTarjetaDebitoFacade;
  @EJB
  private TarjetaDebitoFacadeLocal tarjetaDebitoFacade;
  @EJB
  private TarjetaCreditoFacadeLocal tarjetaCreditoFacade;

  private TarjetaDebito tarjetaDebito;
  private TarjetaCredito tarjetaCredito;

  private CompraTarjetaDebito compraTarjetaDebito;
  private CompraTarjetaCredito compraTarjetaCredito;

  private int monto;
  private String comentario;
  private String tipo;

  public String comprar() {
    if (tarjetaDebito != null) {
      return comprarTarjetaDebito();
    } else if (tarjetaCredito != null) {
      return comprarTarjetaCredito();
    }
    return null;
  }

  public String comprarTarjetaDebito() {
    if (tarjetaDebito.getSaldo() - monto < 0) {
      FacesContext context = FacesContext.getCurrentInstance();
      context.addMessage(null, new FacesMessage("La compra sobrepasa el saldo de su tarjeta de debito"));
      context.validationFailed();
      return "cliente_tarjeta_debito_compra";
    }

    CompraTarjetaDebito compra = new CompraTarjetaDebito();
    compra.setMonto(monto);
    compra.setComentario(comentario);
    compra.setTarjetaDebito(tarjetaDebito);

    tarjetaDebito.setSaldo(tarjetaDebito.getSaldo() - monto);

    compraTarjetaDebitoFacade.create(compra);
    tarjetaDebitoFacade.edit(tarjetaDebito);

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

  public String comprarTarjetaCredito() {
    if (tipo.equals("Nacional")) {
      if (tarjetaCredito.getDeudaNacional() + monto > tarjetaCredito.getLimiteNacional()) {
        FacesContext context = FacesContext.getCurrentInstance();
        context.addMessage(null, new FacesMessage("La compra sobrepasa el limite nacional de su cuenta"));
        context.validationFailed();
        return "cliente_tarjeta_credito_compra";
      }
    } else if (tipo.equals("Internacional")) {
      if (tarjetaCredito.getDeudaInternacional() + monto > tarjetaCredito.getLimiteInternacional()) {
        FacesContext context = FacesContext.getCurrentInstance();
        context.addMessage(null, new FacesMessage("La compra sobrepasa el limite internacional de su cuenta"));
        context.validationFailed();
        return "cliente_tarjeta_credito_compra";
      }
    }

    CompraTarjetaCredito compra = new CompraTarjetaCredito();
    compra.setMonto(monto);
    compra.setComentario(comentario);
    compra.setTipo(tipo);
    compra.setTarjetaCredito(tarjetaCredito);

    switch (tipo) {
      case "Nacional":
        tarjetaCredito.setDeudaNacional(tarjetaCredito.getDeudaNacional() + monto);
        break;
      case "Internacional":
        tarjetaCredito.setDeudaInternacional(tarjetaCredito.getDeudaInternacional() + monto);
        break;
    }

    compraTarjetaCreditoFacade.create(compra);
    tarjetaCreditoFacade.edit(tarjetaCredito);

    this.resetInput();

    return "cliente_tarjeta_credito_view";
  }

  public String deleteCompraTarjetaDebito() {
    tarjetaDebito.setSaldo(tarjetaDebito.getSaldo() + compraTarjetaDebito.getMonto());
    tarjetaDebito.getCompraList().remove(compraTarjetaDebito);
    compraTarjetaDebitoFacade.remove(compraTarjetaDebito);
    tarjetaDebitoFacade.edit(tarjetaDebito);
    return "admin_tarjeta_debito_view";
  }

  public String deleteCompraTarjetaCredito() {
    switch (compraTarjetaCredito.getTipo()) {
      case "Nacional":
        tarjetaCredito.setDeudaNacional(tarjetaCredito.getDeudaNacional() + compraTarjetaCredito.getMonto());
        break;
      case "Internacional":
        tarjetaCredito.setDeudaInternacional(tarjetaCredito.getDeudaInternacional() + compraTarjetaCredito.getMonto());
        break;
    }
    
    tarjetaCredito.getCompraList().remove(compraTarjetaCredito);
    compraTarjetaCreditoFacade.remove(compraTarjetaCredito);
    tarjetaCreditoFacade.edit(tarjetaCredito);
    
    return "admin_tarjeta_credito_view";
  }

  private void resetInput() {
    this.monto = 0;
    this.tarjetaCredito = null;
    this.tarjetaDebito = null;
    this.comentario = null;
  }

  public TarjetaDebito getTarjetaDebito() {
    return tarjetaDebito;
  }

  public void setTarjetaDebito(TarjetaDebito tarjetaDebito) {
    this.tarjetaDebito = tarjetaDebito;
  }

  public TarjetaCredito getTarjetaCredito() {
    return tarjetaCredito;
  }

  public void setTarjetaCredito(TarjetaCredito tarjetaCredito) {
    this.tarjetaCredito = tarjetaCredito;
  }

  public int getMonto() {
    return monto;
  }

  public void setMonto(int monto) {
    this.monto = monto;
  }

  public String getComentario() {
    return comentario;
  }

  public void setComentario(String comentario) {
    this.comentario = comentario;
  }

  public String getTipo() {
    return tipo;
  }

  public void setTipo(String tipo) {
    this.tipo = tipo;
  }

  public CompraTarjetaDebito getCompraTarjetaDebito() {
    return compraTarjetaDebito;
  }

  public void setCompraTarjetaDebito(CompraTarjetaDebito compraTarjetaDebito) {
    this.compraTarjetaDebito = compraTarjetaDebito;
  }

  public CompraTarjetaCredito getCompraTarjetaCredito() {
    return compraTarjetaCredito;
  }

  public void setCompraTarjetaCredito(CompraTarjetaCredito compraTarjetaCredito) {
    this.compraTarjetaCredito = compraTarjetaCredito;
  }

}
