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 int monto;
  private String comentario;
  private String clase;

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

  public String comprarTarjetaDebito() {
    CompraTarjetaDebito compra = new CompraTarjetaDebito();
    compra.setMonto(monto);
    compra.setComentario(comentario);
    compra.setInsertedAt(new Date());
    compra.setTarjetaDebito(tarjetaDebito);

    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";
    }
    tarjetaDebito.setSaldo(tarjetaDebito.getSaldo() - monto);
    tarjetaDebito.getCompraList().add(compra);
    
    compraTarjetaDebitoFacade.edit(compra);
    tarjetaDebitoFacade.edit(tarjetaDebito);
    
    this.resetInput();
    return "cliente_tarjeta_debito_view";
  }

  public String comprarTarjetaCredito() {
    CompraTarjetaCredito compra = new CompraTarjetaCredito();
    compra.setMonto(monto);
    compra.setComentario(comentario);
    compra.setInsertedAt(new Date());
    compra.setTarjetaCredito(tarjetaCredito);

    if (clase.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";
      }
      
      tarjetaCredito.setDeudaNacional(tarjetaCredito.getDeudaNacional() + monto);
    } else if (clase.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";
      }
      tarjetaCredito.setDeudaInternacional(tarjetaCredito.getDeudaInternacional() + monto);
    }

    tarjetaCredito.getCompraList().add(compra);
    
    compraTarjetaCreditoFacade.edit(compra);
    tarjetaCreditoFacade.edit(tarjetaCredito);

    this.resetInput();
    return "cliente_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 getClase() {
    return clase;
  }

  public void setClase(String clase) {
    this.clase = clase;
  }

  
  
}
