<?php 
require_once('../../../includes/load.php');
require_once('../../../vendor/autoload.php');
 

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Style\Alignment;
use PhpOffice\PhpSpreadsheet\Style\Fill;


$OpcionesAnio = $_POST['opciones'];
$OpcionesMes = $_POST['opciones1'];
$OpcionesTGranja = $_POST['opciones2'];
$OpcionesZona = $_POST['opciones3'];

// Verificar si se seleccionaron opciones
if (!empty($OpcionesAnio) && !empty($OpcionesMes) && !empty($OpcionesTGranja) && !empty($OpcionesZona)) {
    // Crear la parte de la consulta SQL con el IN
    $OpcionesAnio = implode(',', array_map('intval', $OpcionesAnio));
    $OpcionesMes = implode(',', array_map('intval', $OpcionesMes));

    // Escapar y entrecomillar cada valor seleccionado
    $OpcionesTGranja = array_map(function($OpcionesTGranja) {
    return "'" . ($OpcionesTGranja) . "'";
    }, $OpcionesTGranja);

    $OpcionesZona = array_map(function($OpcionesZona) {
    return "'" . ($OpcionesZona) . "'";
    }, $OpcionesZona);

    // Crear la parte de la consulta SQL con el IN
    $OpcionesTGranja = implode(',', array_map('strval', $OpcionesTGranja));
    $OpcionesZona = implode(',', array_map('strval', $OpcionesZona));

    // Realizar la consulta SELECT con el IN
    $consulta = $db->query("SELECT operacion.Anio, operacion.Campana, granja.GNombre, granja.AreaTrabajo, case (operacion.Mes) WHEN 1 THEN 'Enero' WHEN 2 THEN 'Febrero' WHEN 3 THEN 'Marzo' WHEN 4 THEN 'Abril' WHEN 5 THEN 'Mayo' WHEN 6 THEN 'Junio' WHEN 7 THEN 'Julio' WHEN 8 THEN 'Agosto' WHEN 9 THEN 'Septiembre' WHEN 10 THEN 'Octubre' WHEN 11 THEN 'Noviembre' WHEN 12 THEN 'Diciembre' END NMes, operacion.TipoGranja, operacion.Reuso, zona.ZNombre, operacion.TCompost, operacion.TPreparacionLimpieza, operacion.TLimpiezaInicial, operacion.TDescanso, operacion.TVacioSanitario, operacion.TLimpieza, operacion.TDescansoProduccion, operacion.FechaEntregaGranja, operacion.Anio, operacion.Mes, operacion.id, operacion.TInicioCompost, operacion.Galpon, operacion.MTTrabajadosReal
                FROM operacion INNER JOIN granja ON operacion.IdGranja = granja.IdGranja INNER JOIN tiposervicio ON operacion.IdTipoServicio = tiposervicio.IdTipoServicio INNER JOIN Zona ON granja.IdZona = zona.IdZona WHERE  operacion.Estado = 'Ejecutado' AND operacion.IdTipoServicio = 1 AND operacion.Anio IN ($OpcionesAnio) AND operacion.Mes IN ($OpcionesMes) AND operacion.TipoGranja IN ($OpcionesTGranja) AND zona.ZNombre IN ($OpcionesZona) ORDER BY Anio DESC, mes DESC, TipoGranja, ZNombre, id;");
 

    $documento = new Spreadsheet();

    $sheet = $documento->getActiveSheet();
    # Se usa para ponerle un titulo a la hoja de excel 
    $sheet->setTitle("Indicadores");


   // Encabezados de columna
    $sheet->setCellValue('A1', 'AÑO');
    $sheet->setCellValue('B1', 'MES');
    $sheet->setCellValue('C1', 'DESTINO');
    $sheet->setCellValue('D1', 'ZONA');
    $sheet->setCellValue('E1', 'OPERACIÓN');
    $sheet->setCellValue('F1', 'CAMPAÑA');
    $sheet->setCellValue('G1', 'REÚSO');
    $sheet->setCellValue('H1', 'GRANJA');
    $sheet->setCellValue('I1', 'ENTREGA');
    $sheet->setCellValue('J1', 'GALPON');
    $sheet->setCellValue('K1', 'AREA');
    $sheet->setCellValue('L1', 'PREPARACIÓN');
    $sheet->setCellValue('M1', 'I. COMPOST');
    $sheet->setCellValue('N1', 'T. COMPOST');
    $sheet->setCellValue('O1', 'LIMPIEZA');
    $sheet->setCellValue('P1', 'DESCANSO');
    $sheet->setCellValue('Q1', 'VACÍO');
    $sheet->setCellValue('R1', 'TÉRMINO');
    $sheet->setCellValue('S1', 'PRODUCCIÓN');

    $row = 2; // Fila inicial para los datos
    $currentAnio = "";
    $currentMes = "";
    $currentTipoGranja = "";
    $currentZNombre = "";
    $mergeStartRowAnio = $row; // Fila de inicio para combinar celdas de Año
    $mergeStartRowMes = $row; // Fila de inicio para combinar celdas de Mes
    $mergeStartRowTipoGranja = $row; // Fila de inicio para combinar celdas de TipoGranja
    $mergeStartRowZNombre = $row; // Fila de inicio para combinar celdas de ZNombre


// Variable auxiliar para rastrear el año anterior
$anteriorZNombre = null;
$filaVaciaZNombre = false;
$anteriorMes = null;
$filaVaciaMes = false;
    

// Recorrer los resultados y agregar los datos a la tabla
while ($rowData = $consulta->fetch_assoc()) {
     // Verificar si el Año ha cambiado
        if ($rowData['Anio'] !== $currentAnio) {
            // Combinar las celdas para el Año anterior
            if ($row - $mergeStartRowAnio > 0) {
                $mergeEndRowAnio = $row - 1;
                $sheet->mergeCells('A' . $mergeStartRowAnio . ':A' . $mergeEndRowAnio);
            }                    
            // Actualizar la fila de inicio para combinar celdas de Año
            $mergeStartRowAnio = $row; 

            // Actualizar el Año actual
            $currentAnio = $rowData['Anio'];
        }

        // Verificar si el Mes ha cambiado
        if ($rowData['NMes'] !== $currentMes) {
            // Combinar las celdas para el Mes anterior
            if ($row - $mergeStartRowMes > 0) {
                $mergeEndRowMes = $row - 1;
                $sheet->mergeCells('B' . $mergeStartRowMes . ':B' . $mergeEndRowMes);
            }

            // Actualizar la fila de inicio para combinar celdas de Mes
            $mergeStartRowMes = $row; 

            // Actualizar el Mes actual
            $currentMes = $rowData['NMes'];

            // Reiniciar variables de TipoGranja 
            $currentTipoGranja = "";
        }

        // Verificar si el TipoGranja ha cambiado
        if ($rowData['TipoGranja'] !== $currentTipoGranja) {
            // Combinar las celdas para el TipoGranja anterior
            if ($row - $mergeStartRowTipoGranja >0) {
                $mergeEndRowTipoGranja = $row - 1;
                $sheet->mergeCells('C' . $mergeStartRowTipoGranja . ':C' . $mergeEndRowTipoGranja);
            }
            // Actualizar la fila de inicio para combinar celdas de TipoGranja
            $mergeStartRowTipoGranja = $row; 

            // Actualizar el TipoGranja actual
            $currentTipoGranja = $rowData['TipoGranja'];

            // Reiniciar variable de ZNombre
            $currentZNombre = "";
        }

        // Verificar si el ZNombre ha cambiado
        if ($rowData['ZNombre'] !== $currentZNombre) {
            // Combinar las celdas para el ZNombre anterior
            if ($row - $mergeStartRowZNombre > 0) {
                $mergeEndRowZNombre = $row - 1;   
                $sheet->mergeCells('D' . $mergeStartRowZNombre . ':D' . $mergeEndRowZNombre);
                
            }
            
            $mergeStartRowZNombre = $row; // Actualizar la fila de inicio para combinar celdas de ZNombre
            // Actualizar el ZNombre actual
            $currentZNombre = $rowData['ZNombre'];
            // Ajustar el índice de fila para insertar la nueva fila debajo del grupo
       }




    // Agregar los datos a las celdas correspondientes
    $sheet->setCellValue('A' . $row, $rowData['Anio']);
    $sheet->setCellValue('B' . $row, $rowData['NMes']);
    $sheet->setCellValue('C' . $row, $rowData['TipoGranja']);
    $sheet->setCellValue('D' . $row, $rowData['ZNombre']);
    $sheet->setCellValue('E' . $row, $rowData['id']);
    $sheet->setCellValue('F' . $row, $rowData['Campana']);
    $sheet->setCellValue('G' . $row, $rowData['Reuso']);
    $sheet->setCellValue('H' . $row, $rowData['GNombre']);
    $sheet->setCellValue('I' . $row, $rowData['FechaEntregaGranja']);
    $sheet->setCellValue('J' . $row, $rowData['Galpon']);
    $sheet->setCellValue('K' . $row, $rowData['MTTrabajadosReal']);
    $sheet->setCellValue('L' . $row, $rowData['TPreparacionLimpieza']);
    $sheet->setCellValue('M' . $row, $rowData['TInicioCompost']);
    $sheet->setCellValue('N' . $row, $rowData['TCompost']);
    $sheet->setCellValue('O' . $row, $rowData['TLimpiezaInicial']);
    $sheet->setCellValue('P' . $row, $rowData['TDescanso']);
    $sheet->setCellValue('Q' . $row, $rowData['TVacioSanitario']);
    $sheet->setCellValue('R' . $row, $rowData['TLimpieza']);
    $sheet->setCellValue('S' . $row, $rowData['TDescansoProduccion']);

    // Incrementar el contador de fila
    $row++;
}   
    
   // Combinar las celdas para el último Año
    if ($row - $mergeStartRowAnio > 1) {
        $mergeEndRowAnio = $row - 1;
        $sheet->mergeCells('A' . $mergeStartRowAnio . ':A' . $mergeEndRowAnio);
    }

    if ($row - $mergeStartRowMes > 1) {
        $mergeEndRowMes = $row - 1;
        $sheet->mergeCells('B' . $mergeStartRowMes . ':B' . $mergeEndRowMes);
    }

    if ($row - $mergeStartRowTipoGranja > 1) {
        $mergeEndRowTipoGranja = $row - 1;
        $sheet->mergeCells('C' . $mergeStartRowTipoGranja . ':C' . $mergeEndRowTipoGranja);
    }

    if ($row - $mergeStartRowZNombre > 1) {
        $mergeEndRowZNombre = $row - 1;
        $sheet->mergeCells('D' . $mergeStartRowZNombre . ':D' . $mergeEndRowZNombre);
    }
    

        // Centrar el texto en las celdas combinadas (horizontal y vertical)
        $style = $sheet->getStyle('A1:S' . ($row - 1));
        $style->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER);
        $style->getAlignment()->setVertical(Alignment::VERTICAL_CENTER);

        // Ajustar el ancho de las columnas automáticamente
        foreach (range('A', 'S') as $column) {
            $sheet->getColumnDimension($column)->setAutoSize(true);
        }

      $writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($documento, 'Xlsx');

      $file_name = 'Indicador';

      $writer->save($file_name);

      header('Content-Type: application/x-www-form-urlencoded');

      header('Content-Transfer-Encoding: Binary');

      header("Content-disposition: attachment; filename=\"".$file_name.".xlsx\"");

      readfile($file_name);

      unlink($file_name);
      exit;
      if($writer= true){
        $session->msg("s", "Se Creo el reporte");
       redirect('../indicador.php',false);
      }
      

    } else {

      $session->msg("d", "No se seleccionaron opciones");
       echo display_msg($msg);
       redirect('../indicador.php',false);
    }



?>



