
package bean;

import beans.CuentaCorrienteFacadeLocal;
import beans.DepositoCuentaCorrienteFacadeLocal;
import beans.DepositoTarjetaDebitoFacadeLocal;
import beans.MetodoFacadeLocal;
import beans.TarjetaDebitoFacadeLocal;
import entities.CuentaCorriente;
import entities.DepositoCuentaCorriente;
import entities.DepositoTarjetaDebito;
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 = "depositoBean")
@SessionScoped
public class DepositoBean implements Serializable {
  @EJB 
  private DepositoCuentaCorrienteFacadeLocal depositoCCFacade;
  @EJB 
  private DepositoTarjetaDebitoFacadeLocal depositoTDFacade;
  @EJB
  private CuentaCorrienteFacadeLocal cuentaCorrienteFacade;
  @EJB
  private TarjetaDebitoFacadeLocal tarjetaDebitoFacade;
  @EJB
  private MetodoFacadeLocal metodoFacade;

  private int monto;
  private String comentario;
  private Metodo metodo;
  private List<Metodo> metodoList;
  private CuentaCorriente cuentaCorriente;
  private TarjetaDebito tarjetaDebito;
  private DepositoCuentaCorriente depositoCuentaCorriente;
  private DepositoTarjetaDebito depositoTarjetaDebito;
  
  @PostConstruct
  private void init(){
    this.metodoList = metodoFacade.findAll();
  }
  
  public String depositar() {
    if(cuentaCorriente != null){
      return depositarEnCuentaCorriente();
    }else if(tarjetaDebito != null){
      return depositarEnTarjetaDebito();
    }else{
      return null;
    }
  }
  
  public String depositarEnCuentaCorriente() {
    DepositoCuentaCorriente deposito = new DepositoCuentaCorriente();
    deposito.setComentario(comentario);
    deposito.setMonto(monto);
    deposito.setMetodo(metodo);
    deposito.setCuentaCorriente(cuentaCorriente);
    
    cuentaCorriente.setSaldo(cuentaCorriente.getSaldo() + monto);
    
    depositoCCFacade.create(deposito);
    cuentaCorrienteFacade.edit(cuentaCorriente);
    
    resetInput();
    return "cliente_cuenta_corriente_view";
  }
  
  public String depositarEnTarjetaDebito() {
    DepositoTarjetaDebito deposito = new DepositoTarjetaDebito();
    deposito.setComentario(comentario);
    deposito.setMonto(monto);
    deposito.setMetodo(metodo);
    deposito.setTarjetaDebito(tarjetaDebito);
    
    tarjetaDebito.setSaldo(tarjetaDebito.getSaldo() + monto);
    
    depositoTDFacade.create(deposito);
    tarjetaDebitoFacade.edit(tarjetaDebito);
    
    resetInput();
    return "cliente_tarjeta_debito_view";
  }

  public String deleteDepositoCuentaCorriente() {
    int monto = depositoCuentaCorriente.getMonto();
    CuentaCorriente cuentaCorriente = depositoCuentaCorriente.getCuentaCorriente();
    
    if(cuentaCorriente.getSaldo() - monto < 0){
      FacesContext facesContext = FacesContext.getCurrentInstance();
      facesContext.addMessage(null, new FacesMessage("Eliminar el deposito dejaria la cuenta en negativo"));
      facesContext.validationFailed();
      return "admin_cuenta_corriente_delete_deposito";
    }

    cuentaCorriente.setSaldo(cuentaCorriente.getSaldo() - monto);
    cuentaCorriente.getDepositoList().remove(depositoCuentaCorriente);
    
    depositoCCFacade.remove(depositoCuentaCorriente);
    cuentaCorrienteFacade.edit(cuentaCorriente);

    return "admin_cuenta_corriente_view";
  }
  
  public String deleteDepositoTarjetaDebito() {
    int monto = depositoTarjetaDebito.getMonto();
    TarjetaDebito tarjetaDebito = depositoTarjetaDebito.getTarjetaDebito();
    
    if(tarjetaDebito.getSaldo() - monto < 0){
      FacesContext facesContext = FacesContext.getCurrentInstance();
      facesContext.addMessage(null, new FacesMessage("Eliminar el deposito dejaria la cuenta en negativo"));
      facesContext.validationFailed();
      return "admin_tarjeta_debito_delete_deposito";
    }

    tarjetaDebito.setSaldo(tarjetaDebito.getSaldo() - monto);
    tarjetaDebito.getDepositoList().remove(depositoTarjetaDebito);
    
    depositoTDFacade.remove(depositoTarjetaDebito);
    tarjetaDebitoFacade.edit(tarjetaDebito);

    return "admin_cuenta_corriente_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 DepositoCuentaCorriente getDepositoCuentaCorriente() {
    return depositoCuentaCorriente;
  }

  public void setDepositoCuentaCorriente(DepositoCuentaCorriente depositoCuentaCorriente) {
    this.depositoCuentaCorriente = depositoCuentaCorriente;
  }

  public DepositoTarjetaDebito getDepositoTarjetaDebito() {
    return depositoTarjetaDebito;
  }

  public void setDepositoTarjetaDebito(DepositoTarjetaDebito depositoTarjetaDebito) {
    this.depositoTarjetaDebito = depositoTarjetaDebito;
  }

  public DepositoCuentaCorrienteFacadeLocal getDepositoCCFacade() {
    return depositoCCFacade;
  }

  public void setDepositoCCFacade(DepositoCuentaCorrienteFacadeLocal depositoCCFacade) {
    this.depositoCCFacade = depositoCCFacade;
  }

  public DepositoTarjetaDebitoFacadeLocal getDepositoTDFacade() {
    return depositoTDFacade;
  }

  public void setDepositoTDFacade(DepositoTarjetaDebitoFacadeLocal depositoTDFacade) {
    this.depositoTDFacade = depositoTDFacade;
  }
  
  
}
