/*
 * 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.DetalleLoteUrbanizacionController;
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.DetalleLoteUrbanizacion;
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.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import static java.util.Calendar.HOUR_OF_DAY;
import static java.util.Calendar.MILLISECOND;
import static java.util.Calendar.MINUTE;
import static java.util.Calendar.SECOND;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
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;
import org.primefaces.event.SelectEvent;

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

    //Variables del Bean
    
    private List<DetalleLoteUrbanizacion> detalleLoteUrbanizacion;
    private DetalleLoteUrbanizacionController detalleLoteUrbanizacionController;
    
    
    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(DetalleUrbanizacionBean.class);
    private List<Manzana> listaManzanas;
    private List<Lote> listaLotes;
    private List<AbonoLote> pagoAbonoLotesPorCliente;
    private List<Predio> listaPredio;
    private Date startDate;
    private Date endDate;
    private Date today;
    
    private boolean proyecto;
    private boolean manzana;
    private boolean lote;
    
    private PredioController controladorPredio;
    private String manzanaSeleccionada;
    private String loteSeleccionado;
    private String predioSeleccionado;

    //Inicializacion del proyecto
    @PostConstruct
    public void init() {
        try {
            fechaHoy = new Date();
            setProyecto(false);
            setManzana(false);
            setLote(false);
            loadBundlePropertyFile();
            setControladorPreventa(new PreventaController());
            setControladorPredio(new PredioController());
            setControladorLote(new LoteController());
            setControladorCobranza(new CobranzaController());
            setDetalleLoteUrbanizacionController(new DetalleLoteUrbanizacionController());
            setListaPredio(getDetalleLoteUrbanizacionController().fillAllPredio(getLoggedUser().getLocation()));
        } catch (Exception e) {
            logger.error("CobranzaBean init", e);
        }
    }
    
    public List<AbonoLote> buscarDatosCobranzaPorCliente(){
        logger.info("buscarDatosCobranzaPorCliente");
        try {
            setPagoAbonoLotesPorCliente(getControladorCobranza().fillAbonoLoteByIdCliente(clienteSeleccionado));
            logger.info("buscarDatosCobranzaPorCliente loaded size " + pagoAbonoLotesPorCliente != null ? pagoAbonoLotesPorCliente.size() : 0);
        } catch (Exception e) {
            logger.error("getDetails", e);
        }
        return null == pagoAbonoLotesPorCliente ? new ArrayList<>() : pagoAbonoLotesPorCliente;
    }

    public void predioChanged(){
        logger.info("onPredioChanged"); 
            setListaManzanas(getDetalleLoteUrbanizacionController().fillAllManzanas(new Predio(predioSeleccionado)));
            setProyecto(true);
            setManzana(false);
            setLote(false);
            setListaLotes(null);
            setLoteSeleccionado(null);
            setManzanaSeleccionada(null);
            setDetalleLoteUrbanizacion(getDetalleLoteUrbanizacionController().buscarDetallesLotesBetweenDates(predioSeleccionado, "proyecto",getStartDate(),getEndDate()));
    }
    
    public void manzanaChanged(){
            logger.info("onManzanaChanged"); 
            setListaLotes(getDetalleLoteUrbanizacionController().fillAllLotes(new Manzana(manzanaSeleccionada)));
            setDetalleLoteUrbanizacion(getDetalleLoteUrbanizacionController().buscarDetallesLotesBetweenDates(manzanaSeleccionada, "manzana",getStartDate(),getEndDate()));
            setProyecto(false);
            setManzana(true);
            setLote(false);
            setLoteSeleccionado(null);
    }
    
    public void loteChanged(){
            logger.info("onloteChanged"); 
            setDetalleLoteUrbanizacion(getDetalleLoteUrbanizacionController().buscarDetallesLotesBetweenDates(loteSeleccionado, "lote",getStartDate(),getEndDate()));
    
            setProyecto(false);
            setManzana(false);
            setLote(true);
    }
    
    public void updateReport(){
                if(isProyecto()){
                    setDetalleLoteUrbanizacion(getDetalleLoteUrbanizacionController().buscarDetallesLotesBetweenDates(predioSeleccionado, "proyecto",getStartDate(),getEndDate()));
                }
                if(isManzana())
                {
                    setDetalleLoteUrbanizacion(getDetalleLoteUrbanizacionController().buscarDetallesLotesBetweenDates(manzanaSeleccionada, "manzana",getStartDate(),getEndDate()));
                }
                
                if(isLote()){
                setDetalleLoteUrbanizacion(getDetalleLoteUrbanizacionController().buscarDetallesLotesBetweenDates(loteSeleccionado, "lote",getStartDate(),getEndDate()));
                }
                
    
    
    }

    
        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 void buscarDatos() {
        System.out.println(clienteSeleccionado);
        setListaLotes(getControladorLote().buscarLotesPorIdPersona(clienteSeleccionado));
        
    }
    
    private void setUpDates(boolean init) {
        Calendar startCalendar = Calendar.getInstance();
        Calendar endCalendar = Calendar.getInstance();

        if (!init) {
            startCalendar.setTime(getStartDate());
            endCalendar.setTime(getEndDate());
        } else {
            startCalendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
            endCalendar.setTime(new Date());
        }

        startCalendar.add(Calendar.HOUR_OF_DAY, 2);
        startCalendar.add(Calendar.MINUTE, 0);
        startCalendar.add(Calendar.SECOND, 0);
        startCalendar.add(Calendar.MILLISECOND, 0);

        endCalendar.add(Calendar.HOUR_OF_DAY, 22);
        endCalendar.add(Calendar.MINUTE, 59);
        endCalendar.add(Calendar.SECOND, 59);
        endCalendar.add(Calendar.MILLISECOND, 0);

        setStartDate(startCalendar.getTime());
        setEndDate(endCalendar.getTime());
    }

    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 String getManzanaSeleccionada() {
        return manzanaSeleccionada;
    }

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

    public String getLoteSeleccionado() {
        return loteSeleccionado;
    }

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

    public String getPredioSeleccionado() {
        return predioSeleccionado;
    }

    public void setPredioSeleccionado(String 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 Date getToday() {
        if (null == today) {
            today = new Date();
        }
        return today;
    }
    

    @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
    }

    public List<DetalleLoteUrbanizacion> getDetalleLoteUrbanizacion() {
        return detalleLoteUrbanizacion;
    }

    public void setDetalleLoteUrbanizacion(List<DetalleLoteUrbanizacion> detalleLoteUrbanizacion) {
        this.detalleLoteUrbanizacion = detalleLoteUrbanizacion;
    }

    public DetalleLoteUrbanizacionController getDetalleLoteUrbanizacionController() {
        return detalleLoteUrbanizacionController;
    }

    public void setDetalleLoteUrbanizacionController(DetalleLoteUrbanizacionController detalleLoteUrbanizacionController) {
        this.detalleLoteUrbanizacionController = detalleLoteUrbanizacionController;
    }

    public Date getStartDate() {
        
        if (null == startDate) {
            Calendar calendar = Calendar.getInstance();

            calendar.add(Calendar.MONTH, -1);

            calendar.set(HOUR_OF_DAY, 0);
            calendar.set(MINUTE, 0);
            calendar.set(SECOND, 0);
            calendar.set(MILLISECOND, 0);

            startDate = calendar.getTime();
        }

        return startDate;
        
    }

    public void setStartDate(Date startDate) {
        this.startDate = startDate;
    }

    public Date getEndDate() {
        if (null == endDate) {
            endDate = new Date();
        }
        return endDate;
    }

    public void setEndDate(Date endDate) {
        this.endDate = endDate;
    }

    public boolean isProyecto() {
        return proyecto;
    }

    public void setProyecto(boolean proyecto) {
        this.proyecto = proyecto;
    }

    public boolean isManzana() {
        return manzana;
    }

    public void setManzana(boolean manzana) {
        this.manzana = manzana;
    }

    public boolean isLote() {
        return lote;
    }

    public void setLote(boolean lote) {
        this.lote = lote;
    }

    
}
