package bean;

import beans.CuentaCorrienteFacade;
import beans.CuentaCorrienteFacadeLocal;
import beans.GiroCuentaCorrienteFacade;
import beans.GiroCuentaCorrienteFacadeLocal;
import beans.GiroTarjetaDebitoFacadeLocal;
import beans.MetodoFacadeLocal;
import beans.TarjetaDebitoFacadeLocal;
import entities.CuentaCorriente;
import entities.GiroCuentaCorriente;
import entities.GiroTarjetaDebito;
import entities.Metodo;
import entities.TarjetaDebito;
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.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Named;

@Named(value = "giroBean")
@SessionScoped
public class GiroBean implements Serializable {

  @EJB
  private GiroCuentaCorrienteFacadeLocal giroCCFacade;
  @EJB
  private GiroTarjetaDebitoFacadeLocal giroTDFacade;
  @EJB
  private MetodoFacadeLocal metodoFacade;
  @EJB
  private CuentaCorrienteFacadeLocal cuentaCorrienteFacade;
  @EJB
  private TarjetaDebitoFacadeLocal tarjetaDebitoFacade;

  private GiroCuentaCorriente giroCuentaCorriente;
  private GiroTarjetaDebito giroTarjetaDebito;
  private int monto;
  private String comentario;
  private Metodo metodo;
  private List<Metodo> metodoList;
  private CuentaCorriente cuentaCorriente;
  private TarjetaDebito tarjetaDebito;

  @PostConstruct
  private void init() {
    this.metodoList = metodoFacade.findAll();
  }

  public String girar() {
    if (cuentaCorriente != null) {
      return girarEnCuentaCorriente();
    } else if (tarjetaDebito != null) {
      return girarEnTarjetaDebito();
    } else {
      return null;
    }
  }

  public String girarEnCuentaCorriente() {
    if (cuentaCorriente.getSaldo() - monto < 0) {
      FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("El monto sobrepasa el saldo de la cuenta corriente"));
      FacesContext.getCurrentInstance().validationFailed();
      return "cliente_cuenta_corriente_girar";
    }

    GiroCuentaCorriente giro = new GiroCuentaCorriente();
    giro.setComentario(comentario);
    giro.setMonto(monto);
    giro.setMetodo(metodo);
    giro.setCuentaCorriente(cuentaCorriente);

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

    giroCCFacade.create(giro);
    cuentaCorrienteFacade.edit(cuentaCorriente);

    resetInput();
    return "cliente_cuenta_corriente_view";
  }

  public String girarEnTarjetaDebito() {
    if (tarjetaDebito.getSaldo() - monto < 0) {
      FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("El monto sobrepasa el saldo de la tarjeta de debito"));
      FacesContext.getCurrentInstance().validationFailed();
      return "cliente_tarjeta_debito_girar";
    }

    GiroTarjetaDebito giro = new GiroTarjetaDebito();
    giro.setComentario(comentario);
    giro.setMonto(monto);
    giro.setMetodo(metodo);
    giro.setTarjetaDebito(tarjetaDebito);

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

    giroTDFacade.create(giro);
    tarjetaDebitoFacade.edit(tarjetaDebito);

    resetInput();
    return "cliente_tarjeta_debito_view";
  }

  public String deleteGiroEnCuentaCorriente() {
    cuentaCorriente.setSaldo(cuentaCorriente.getSaldo() + giroCuentaCorriente.getMonto());
    cuentaCorriente.getGiroList().remove(giroCuentaCorriente);
    giroCCFacade.remove(giroCuentaCorriente);
    cuentaCorrienteFacade.edit(cuentaCorriente);
    return "admin_cuenta_corriente_view";
  }
  
  public String deleteGiroEnTarjetaDebito() {
    tarjetaDebito.setSaldo(tarjetaDebito.getSaldo() + giroTarjetaDebito.getMonto());
    tarjetaDebito.getGiroList().remove(giroTarjetaDebito);
    giroTDFacade.remove(giroTarjetaDebito);
    tarjetaDebitoFacade.edit(tarjetaDebito);
    return "admin_tarjeta_debito_view";
  }

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

  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 Metodo getMetodo() {
    return metodo;
  }

  public void setMetodo(Metodo metodo) {
    this.metodo = metodo;
  }

  public CuentaCorriente getCuentaCorriente() {
    return cuentaCorriente;
  }

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

  public TarjetaDebito getTarjetaDebito() {
    return tarjetaDebito;
  }

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

  public List<Metodo> getMetodoList() {
    return metodoList;
  }

  public void setMetodoList(List<Metodo> metodoList) {
    this.metodoList = metodoList;
  }

  public GiroCuentaCorriente getGiroCuentaCorriente() {
    return giroCuentaCorriente;
  }

  public void setGiroCuentaCorriente(GiroCuentaCorriente giroCuentaCorriente) {
    this.giroCuentaCorriente = giroCuentaCorriente;
  }

  public GiroTarjetaDebito getGiroTarjetaDebito() {
    return giroTarjetaDebito;
  }

  public void setGiroTarjetaDebito(GiroTarjetaDebito giroTarjetaDebito) {
    this.giroTarjetaDebito = giroTarjetaDebito;
  }
  
  

}
