/*
 * 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.spa;

import com.arrebol.taxiservicios.beans.TaxiGenericBean;
import com.arrebol.taxiservicios.controller.spa.VentasBeanController;
import com.arrebol.taxiservicios.model.enums.GenericEnumType;
import com.arrebol.taxiservicios.model.spa.PagosDetalle;
import com.arrebol.taxiservicios.model.spa.PagosSpaView;
import java.io.Serializable;
import java.text.DateFormatSymbols;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Comparator;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
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.model.chart.PieChartModel;

/**
 *
 * @author Crov
 */
@Named("estTotalVentasBean")
@ViewScoped
public class EstTotalVentasBean extends TaxiGenericBean implements Serializable {

   private static final long serialVersionUID = -7284027390656669184L;
   final Logger logger = LogManager.getLogger(getClass());

   private VentasBeanController ventasBeanController;
   private PieChartModel pieModel;
   private String fechaInicio;
   private String fechaFin;

   @PostConstruct
   public void init() {
      try {
         setVentasBeanController(new VentasBeanController());
         cargarGrafica();
      } catch (Exception e) {
         logger.error("init(): " + e);
      }
   }

   public void cargarGrafica() {
      SimpleDateFormat sdf = new SimpleDateFormat("MMMM yyyy");
      // Se inicializa la grafica
      setPieModel(new PieChartModel());
      getPieModel().setFill(true);
      // se carga la lista de abonos

      Calendar endDate = Calendar.getInstance();
      endDate.setTime(fechaMasUno(new Date()));
      setFechaFin(sdf.format(endDate.getTime()));

      Calendar startDate = Calendar.getInstance();
      startDate.setTime(fechaMasUno(new Date()));
      startDate.add(Calendar.MONTH, -6);
      setFechaInicio(sdf.format(startDate.getTime()));

      List<PagosSpaView> abonos = getVentasBeanController().buscarPagosSpaViewPagadosPorRangoFechas(GenericEnumType.ENABLED, startDate.getTime(), endDate.getTime(), getLoggedUser().getLocation());

      // Map para almacenar totales por mes
      Map<String, Double> totalesPorMesYAnio = new LinkedHashMap<>();
      // Variable para mantener el máximo total alcanzado
      double maxTotal = 0.0;
      Calendar calendar = Calendar.getInstance();
      double currentTotal = 0.0;
      // Se valida si se encontraron abono
      if (!abonos.isEmpty()) {
         for (PagosSpaView abono : abonos) {
            List<PagosDetalle> valSubAbonos = getVentasBeanController().buscarPagosDetalleByAbonoLote(abono.getIdPago());
            if (valSubAbonos.isEmpty()) {
               // Configurar el calendario con la fecha del abono
               calendar.setTime(abono.getFechaPago());
               int year = calendar.get(Calendar.YEAR);
               int month = calendar.get(Calendar.MONTH) + 1;

               String monthAndYear = year + "-" + month;
               // Crear una clave única para mes y año

               if (totalesPorMesYAnio.containsKey(monthAndYear)) {
                  currentTotal = totalesPorMesYAnio.get(monthAndYear);
               } else {
                  currentTotal = 0.0;
               }
               // Sumar al total del mes actual
               currentTotal += abono.getCantidadPagada() == null ? 0.0 : abono.getCantidadPagada();
               // Actualizar el máximo total si es necesario
               if (currentTotal > maxTotal) {
                  maxTotal = currentTotal;
               }
               // Guardar el total actualizado
               totalesPorMesYAnio.put(monthAndYear, currentTotal);
            }
         }

         // Ordenar el Map por fecha de menor a mayor
         Map<String, Double> totalesOrdenados = totalesPorMesYAnio.entrySet()
                 .stream()
                 .sorted(Comparator.comparing(entry -> LocalDate.parse(entry.getKey() + "-01", DateTimeFormatter.ofPattern("yyyy-M-dd"))))
                 .collect(Collectors.toMap(
                         Map.Entry::getKey,
                         Map.Entry::getValue,
                         (e1, e2) -> e1,
                         LinkedHashMap::new
                 ));

         // Se itera a través de cada entrada en el mapa totalesPorMesYAnio
         for (Map.Entry<String, Double> entry : totalesOrdenados.entrySet()) {
            String monthAndYear = entry.getKey();
            double total = entry.getValue();

            // Obtener el nombre del mes y año del arreglo de nombres de meses
            String[] parts = monthAndYear.split("-");
            int year = Integer.parseInt(parts[0]);
            int month = Integer.parseInt(parts[1]) - 1;
            String monthName = new DateFormatSymbols().getMonths()[month];
            String label = monthName + " " + year;

            // Agregar el total a la gráfica con el nombre del mes y año como etiqueta
            getPieModel().set(label, total);
         }

      } else {
         getPieModel().set("mes", 0);
      }

      getPieModel().setTitle("Comparativa de ventas mensuales (" + getFechaInicio() + "-" + getFechaFin() + ")");
      getPieModel().setLegendPosition("w");
      getPieModel().setShadow(false);

   }

   private Date fechaMasUno(Date fecha) {
      Calendar fechaMasUno = Calendar.getInstance();
      fechaMasUno.setTime(fecha);
      fechaMasUno.add(Calendar.DAY_OF_MONTH, 1);
      return fechaMasUno.getTime();
   }

   public VentasBeanController getVentasBeanController() {
      return ventasBeanController;
   }

   public void setVentasBeanController(VentasBeanController ventasBeanController) {
      this.ventasBeanController = ventasBeanController;
   }

   public PieChartModel getPieModel() {
      return pieModel;
   }

   public void setPieModel(PieChartModel pieModel) {
      this.pieModel = pieModel;
   }

   public String getFechaInicio() {
      return fechaInicio;
   }

   public void setFechaInicio(String fechaInicio) {
      this.fechaInicio = fechaInicio;
   }

   public String getFechaFin() {
      return fechaFin;
   }

   public void setFechaFin(String fechaFin) {
      this.fechaFin = fechaFin;
   }

}
