/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.arrebol.taxiservicios.beans.report;

import com.arrebol.taxiservicios.beans.Datatable;
import com.arrebol.taxiservicios.beans.TaxiGenericBean;
import com.arrebol.taxiservicios.controller.admin.CustomerController;
import com.arrebol.taxiservicios.controller.admin.GenericPersonController;
import com.arrebol.taxiservicios.controller.cobranza.CobranzaController;
import com.arrebol.taxiservicios.controller.predio.LoteController;
import com.arrebol.taxiservicios.controller.predio.PredioController;
import com.arrebol.taxiservicios.controller.predio.PreventaController;
import com.arrebol.taxiservicios.model.core.Person;
import com.arrebol.taxiservicios.model.enums.GenericEnumType;
import com.arrebol.taxiservicios.model.enums.PersonType;
import com.arrebol.taxiservicios.model.predio.AbonoLote;
import com.arrebol.taxiservicios.model.predio.AbonoLoteView;
import com.arrebol.taxiservicios.model.predio.Lote;
import com.arrebol.taxiservicios.model.predio.Manzana;
import com.arrebol.taxiservicios.model.predio.Predio;
import com.arrebol.taxiservicios.model.view.PersonListView;
import java.io.Serializable;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.view.ViewScoped;
import javax.inject.Named;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.primefaces.event.ReorderEvent;
import org.primefaces.event.RowEditEvent;

/**
 *
 * @author Usuario
 */
@Named("clienteBean")
@ViewScoped
public class ClienteBean extends TaxiGenericBean implements Serializable, Datatable {

    //Variables del Bean
    private List<PersonListView> clientesBuscar;
    private String clienteSeleccionado;
    private Date fechaHoy;
    private Person clienteParaConsultar;
    private PreventaController controladorPreventa;
    private CobranzaController controladorCobranza;
    private LoteController controladorLote;
    final Logger logger = LogManager.getLogger(ClienteBean.class);
    private List<Manzana> listaManzanas;
    private List<Lote> listaLotes;
    private List<AbonoLote> pagoAbonoLotesPorCliente;
    private List<AbonoLoteView> listAbonoLoteView;
    private List<Predio> listaPredio;
    private PredioController controladorPredio;
    private Manzana manzanaSeleccionada;
    private Lote loteSeleccionado;
    private Predio predioSeleccionado;

    //Inicializacion del proyecto
    @PostConstruct
    public void init() {
        try {
            fechaHoy = new Date();
            loadBundlePropertyFile();
            setControladorPreventa(new PreventaController());
            setControladorPredio(new PredioController());
            setControladorLote(new LoteController());
            setControladorCobranza(new CobranzaController());
            setClientesBuscar(getControladorPreventa().findListOfPersonsByType(PersonType.CUSTOMER, getLoggedUser().getLocation()));
        } catch (Exception e) {
            logger.error("CobranzaBean init", e);
        }
    }
    
    public List<AbonoLoteView> buscarDatosCobranzaPorCliente(Lote lote){
        logger.info("buscarDatosCobranzaPorCliente");
        try {
            setPagoAbonoLotesPorCliente(getControladorCobranza().fillAbonoLoteByLote(lote));
            setListAbonoLoteView(getControladorCobranza().fillAbonoLoteViewByLote(lote));
            logger.info("buscarDatosCobranzaPorCliente loaded size " + listAbonoLoteView != null ? listAbonoLoteView.size() : 0);
        } catch (Exception e) {
            logger.error("getDetails", e);
        }
        return null == listAbonoLoteView ? new ArrayList<>() : listAbonoLoteView;
    }

    
        public String validarColor(GenericEnumType valorComparar, Date fechaPagar) {
        if (valorComparar.equals(GenericEnumType.ENABLED)) {
            return "datatableRowGreen";
        } else if (fechaPagar.before(fechaHoy)) {
            Calendar fechaPagarCalendar = Calendar.getInstance();
            fechaPagarCalendar.setTime(fechaPagar);
            Calendar fechaHoyCalendar = Calendar.getInstance();
            fechaHoyCalendar.setTime(fechaHoy);
            long diferenciaEnMilisegundos = fechaPagarCalendar.getTimeInMillis() - fechaHoyCalendar.getTimeInMillis();
            long diferenciaEnDias = diferenciaEnMilisegundos / (24 * 60 * 60 * 1000);
            System.out.println("La diferencia entre las fechas es de " + diferenciaEnDias + " días.");
            if(diferenciaEnDias >=5 && diferenciaEnDias <=0){
                return "datatableRowLittle";
            }else if (diferenciaEnDias == 0){
                return "datatableRowLittle";
            }else{
                return "datatableRowEmpty";
            }
        } else if (fechaPagar.after(fechaHoy)){
            Calendar fechaPagarCalendar = Calendar.getInstance();
            fechaPagarCalendar.setTime(fechaPagar);
            Calendar fechaHoyCalendar = Calendar.getInstance();
            fechaHoyCalendar.setTime(fechaHoy);
            long diferenciaEnMilisegundos = fechaPagarCalendar.getTimeInMillis() - fechaHoyCalendar.getTimeInMillis();
            long diferenciaEnDias = diferenciaEnMilisegundos / (24 * 60 * 60 * 1000);
            if(diferenciaEnDias <=5 && diferenciaEnDias >=0){
                return "datatableRowLittle";
            }else if (diferenciaEnDias > 5 ){
                return "";
            }else{
                return "datatableRowEmpty";
            }
        }
        return "";
    }
        
    public String validarColorAbono(GenericEnumType estatus, Date fechaPagar) {
            Date hoy = new Date();

            // Crea un formato para establecer la hora, minutos y segundos en 00:00:00
           SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
           try {
               fechaPagar = sdf.parse(sdf.format(fechaPagar));
               hoy = sdf.parse(sdf.format(hoy));
           } catch (ParseException e) {

           }

           // Calcula la diferencia en días
           long diferenciaEnMillis = fechaPagar.getTime() - hoy.getTime();
           long diferenciaEnDias = diferenciaEnMillis / (24 * 60 * 60 * 1000);
           
           if (estatus==null) {
               return "";           
           }else if (estatus.equals(GenericEnumType.ENABLED)) {
               return "rowGreen";
           } else if (estatus.equals(GenericEnumType.INCOMPLETE)) {
              return "rowYellow";
           } else if (fechaPagar.before(hoy)) {
               return "rowRed";
           }else if(diferenciaEnDias > 0 && diferenciaEnDias<=3){
              return "rowOrange";                         
           }else{
               return "";      
           }
      }
    
    public void buscarDatos() {
        System.out.println(clienteSeleccionado);
        setListaLotes(getControladorLote().buscarLotesPorIdPersona(clienteSeleccionado));
        
    }

    public List<PersonListView> getClientesBuscar() {
        return clientesBuscar;
    }

    public void setClientesBuscar(List<PersonListView> clienteBuscar) {
        this.clientesBuscar = clienteBuscar;
    }

    public PreventaController getControladorPreventa() {
        return controladorPreventa;
    }

    public void setControladorPreventa(PreventaController controladorPreventa) {
        this.controladorPreventa = controladorPreventa;
    }

    public List<Manzana> getListaManzanas() {
        return listaManzanas;
    }

    public void setListaManzanas(List<Manzana> listaManzanas) {
        this.listaManzanas = listaManzanas;
    }

    public List<Lote> getListaLotes() {
        return listaLotes;
    }

    public void setListaLotes(List<Lote> listaLotes) {
        this.listaLotes = listaLotes;
    }

    public List<Predio> getListaPredio() {
        return listaPredio;
    }

    public void setListaPredio(List<Predio> listaPredio) {
        this.listaPredio = listaPredio;
    }

    public Manzana getManzanaSeleccionada() {
        return manzanaSeleccionada;
    }

    public void setManzanaSeleccionada(Manzana manzanaSeleccionada) {
        this.manzanaSeleccionada = manzanaSeleccionada;
    }

    public Lote getLoteSeleccionado() {
        return loteSeleccionado;
    }

    public void setLoteSeleccionado(Lote loteSeleccionado) {
        this.loteSeleccionado = loteSeleccionado;
    }

    public Predio getPredioSeleccionado() {
        return predioSeleccionado;
    }

    public void setPredioSeleccionado(Predio predioSeleccionado) {
        this.predioSeleccionado = predioSeleccionado;
    }

    public String getClienteSeleccionado() {
        return clienteSeleccionado;
    }

    public void setClienteSeleccionado(String clienteSeleccionado) {
        this.clienteSeleccionado = clienteSeleccionado;
    }

    public PredioController getControladorPredio() {
        return controladorPredio;
    }

    public void setControladorPredio(PredioController controladorPredio) {
        this.controladorPredio = controladorPredio;
    }

    public Person getClienteParaConsultar() {
        return clienteParaConsultar;
    }

    public void setClienteParaConsultar(Person clienteParaConsultar) {
        this.clienteParaConsultar = clienteParaConsultar;
    }

    public LoteController getControladorLote() {
        return controladorLote;
    }

    public void setControladorLote(LoteController controladorLote) {
        this.controladorLote = controladorLote;
    }

    public CobranzaController getControladorCobranza() {
        return controladorCobranza;
    }

    public void setControladorCobranza(CobranzaController controladorCobranza) {
        this.controladorCobranza = controladorCobranza;
    }

    public List<AbonoLote> getPagoAbonoLotesPorCliente() {
        return pagoAbonoLotesPorCliente;
    }

    public void setPagoAbonoLotesPorCliente(List<AbonoLote> pagoAbonoLotesPorCliente) {
        this.pagoAbonoLotesPorCliente = pagoAbonoLotesPorCliente;
    }

    public Date getFechaHoy() {
        return fechaHoy;
    }

    public void setFechaHoy(Date fechaHoy) {
        this.fechaHoy = fechaHoy;
    }

    public List<AbonoLoteView> getListAbonoLoteView() {
        return listAbonoLoteView;
    }

    public void setListAbonoLoteView(List<AbonoLoteView> listAbonoLoteView) {
        this.listAbonoLoteView = listAbonoLoteView;
    }

    @Override
    public void editRow(RowEditEvent event) {
        throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
    }

    @Override
    public void onRowCancel(RowEditEvent event) {
        throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
    }

    @Override
    public void onRowReorder(ReorderEvent event) {
        throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
    }

    @Override
    public void addRow() {
        throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
    }

    @Override
    public void deleteRow() {
        throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
    }

}
