package bean;

import beans.CuentaCorrienteFacadeLocal;
import beans.LineaSobregiroFacadeLocal;
import beans.TarjetaCreditoFacadeLocal;
import entities.CuentaCorriente;
import entities.LineaSobregiro;
import entities.LineaSobregiro_;
import entities.TarjetaCredito;
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;

@Named(value = "lineaSobregiroBean")
@SessionScoped
public class LineaSobregiroBean implements Serializable {

  @EJB
  private LineaSobregiroFacadeLocal lineaSobregiroFacade;
  @EJB
  private TarjetaCreditoFacadeLocal tarjetaCreditoFacade;
  @EJB
  private CuentaCorrienteFacadeLocal cuentaCorrienteFacade;

  private TarjetaCredito tarjetaCredito;
  private CuentaCorriente cuentaCorriente;

  private LineaSobregiro lineaSobregiro;

  private int monto;
  private int limite;

  public String contratarParaTarjetaCredito() {
    if (limite <= 0) {
      FacesContext context = FacesContext.getCurrentInstance();
      context.addMessage(null, new FacesMessage("El limite tiene que ser mayor a 0"));
      context.validationFailed();
      return "admin_linea_sobregiro_credito_contratar";
    }

    LineaSobregiro lineaSobregiro = new LineaSobregiro();
    lineaSobregiro.setLimite(limite);

    tarjetaCredito.setLineaSobregiro(lineaSobregiro);

    lineaSobregiroFacade.create(lineaSobregiro);
    tarjetaCreditoFacade.edit(tarjetaCredito);

    return "admin_tarjeta_credito_view";
  }

  public String contratarParaCuentaCorriente() {
    if (limite <= 0) {
      FacesContext context = FacesContext.getCurrentInstance();
      context.addMessage(null, new FacesMessage("El limite tiene que ser mayor a 0"));
      context.validationFailed();
      return "admin_linea_sobregiro_corriente_contratar";
    }

    LineaSobregiro lineaSobregiro = new LineaSobregiro();
    lineaSobregiro.setLimite(limite);

    cuentaCorriente.setLineaSobregiro(lineaSobregiro);

    lineaSobregiroFacade.create(lineaSobregiro);
    cuentaCorrienteFacade.edit(cuentaCorriente);

    return "admin_cuenta_corriente_view";
  }

  public String pagarSobregiroCredito() {
    if (lineaSobregiro.getSobregiro() == 0) {
      FacesContext context = FacesContext.getCurrentInstance();
      context.addMessage(null, new FacesMessage("No hay ningun sobregiro que pagar"));
      context.validationFailed();
      return "cliente_tarjeta_credito_sobregiro_pagar";
    }

    if (lineaSobregiro.getSobregiro() - monto < 0) {
      FacesContext context = FacesContext.getCurrentInstance();
      context.addMessage(null, new FacesMessage("El pago sobrepasa la deuda"));
      context.validationFailed();
      return "cliente_tarjeta_credito_sobregiro_pagar";
    }
    
    lineaSobregiro.setSobregiro(lineaSobregiro.getSobregiro() - monto);
    lineaSobregiroFacade.edit(lineaSobregiro);

    return "cliente_tarjeta_credito_view";
  }

  public String pagarSobregiroCorriente() {
    if (lineaSobregiro.getSobregiro() == 0) {
      FacesContext context = FacesContext.getCurrentInstance();
      context.addMessage(null, new FacesMessage("No hay ningun sobregiro que pagar"));
      context.validationFailed();
      return "cliente_cuenta_corriente_sobregiro_pagar";
    }

    if (lineaSobregiro.getSobregiro() - monto < 0) {
      FacesContext context = FacesContext.getCurrentInstance();
      context.addMessage(null, new FacesMessage("El pago sobrepasa la deuda"));
      context.validationFailed();
      return "cliente_cuenta_corriente_sobregiro_pagar";
    }
    
    lineaSobregiro.setSobregiro(lineaSobregiro.getSobregiro() - monto);
    lineaSobregiroFacade.edit(lineaSobregiro);

    return "cliente_cuenta_corriente_view";
  }

  public TarjetaCredito getTarjetaCredito() {
    return tarjetaCredito;
  }

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

  public CuentaCorriente getCuentaCorriente() {
    return cuentaCorriente;
  }

  public void setCuentaCorriente(CuentaCorriente cuentaCorriente) {
    this.cuentaCorriente = cuentaCorriente;
  }

  public LineaSobregiro getLineaSobregiro() {
    return lineaSobregiro;
  }

  public void setLineaSobregiro(LineaSobregiro lineaSobregiro) {
    this.lineaSobregiro = lineaSobregiro;
  }

  public int getLimite() {
    return limite;
  }

  public void setLimite(int limite) {
    this.limite = limite;
  }

  public int getMonto() {
    return monto;
  }

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