<?php

$fecha = date('d_m_Y');
/* header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
header("Content-Disposition: attachment;filename=horario_$fecha.xlsx");
header("Cache-Control: max-age=0"); */

$ruta = "..";
require_once "$ruta/class/c_login.php";
if (!isset($_SESSION['user'])) {
    http_response_code(401);
    die(json_encode(['error' => 'unauthorized']));
}
$user = unserialize($_SESSION['user']);

$json = file_get_contents('php://input');
$params = json_decode($json, true);

$profesor_clave = isset($params['profesor'])
    ? preg_replace('/[^\d]/', '', $params['profesor'])
    : null;

$data = $db->query(
    "SELECT DISTINCT
        auditoria->>'registro_fecha_ideal' as registro_fecha_ideal,
        auditoria->>'profesor_clave' as profesor_clave,
        auditoria->>'profesor_nombre' as profesor_nombre,
        NULLIF(auditoria->>'profesor_correo', '') as profesor_correo,
        auditoria->>'facultad' as facultad,
        auditoria->>'materia' as materia,
        auditoria->>'carrera' as carrera,
        NULLIF(auditoria->>'horario_grupo', '') as horario_grupo,
        auditoria->>'horario_hora_completa' as horario_hora_completa,
        auditoria->>'salon' as salon,
        (
            SELECT string_agg(value, ' / ' ORDER BY value) 
            FROM jsonb_array_elements_text(auditoria->'salon_array') AS value
        ) as salon_array,
        auditoria->>'asistencia' as asistencia,
        auditoria->>'registro_fecha' as registro_fecha,
        auditoria->>'usuario_nombre' as usuario_nombre,
        auditoria->>'nombre' as nombre,
        auditoria->>'registro_fecha_supervisor' as registro_fecha_supervisor,
        auditoria->>'comentario' as comentario,
        auditoria->>'justificacion' as justificacion,
        auditoria->>'horario_hora' as horario_hora,
        auditoria->>'horario_fin' as horario_fin,
        (auditoria->>'estado_supervisor_id')::integer as estado_id,
        (auditoria->>'registro_retardo')::BOOLEAN as registro_retardo
    FROM last_auditoria
    -- JOIN BLOQUE_HORARIO ON ((auditoria->>'horario_hora')::TIME, (auditoria->>'horario_fin')::TIME) OVERLAPS (HORA_INICIO, HORA_FIN)
    WHERE USUARIO_ID = :usuario_id
        AND auditoria->>'facultad_id' = COALESCE(:facultad_id, auditoria->>'facultad_id')
        AND auditoria->>'profesor_clave' = COALESCE(:profesor_clave, auditoria->>'profesor_clave')
        /*AND BLOQUE_HORARIO.ID = COALESCE(:bloque_horario_id, BLOQUE_HORARIO.ID)*/",
    [
        'usuario_id' => $user->user['id'],
        'facultad_id' => $params['facultad_id'],
        'profesor_clave' => $profesor_clave,
        /* 'bloque_horario_id' => $params['bloque_horario'] */
    ]
);

$estados = empty($params['estados']) ? null : $params['estados'];

$data = array_filter(
    $data,
    fn($fila) => in_array($fila['estado_id'], $estados ?? [$fila['estado_id']])
);

$data = array_values($data);

empty($data) and die(json_encode(['error' => 'No se recibieron datos', 'data' => $data]));

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Style\Color;
use PhpOffice\PhpSpreadsheet\Style\Fill;
use PhpOffice\PhpSpreadsheet\Style\Alignment;
use PhpOffice\PhpSpreadsheet\IOFactory;

$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();

// Image settings
$drawing = new \PhpOffice\PhpSpreadsheet\Worksheet\Drawing();
$drawing->setName('La Salle')
    ->setDescription('La Salle')
    ->setPath('../imagenes/logo.png')
    ->setCoordinates('B1')
    ->setHeight(100)
    ->setOffsetX(10)
    ->setWorksheet($spreadsheet->getActiveSheet());

$data_excel = array(
    "FECHA" => 'registro_fecha_ideal',
    "CLAVE" => 'profesor_clave',
    "PROFESOR" => 'profesor_nombre',
    "CORREO" => 'profesor_correo',
    "FACULTAD" => 'facultad',
    "MATERIA" => 'materia',
    "CARRERA / PROGRAMA" => 'carrera',
    "GRUPO" => 'horario_grupo',
    "HORARIO" => 'horario_hora_completa',
    "SALÓN" => 'salon',
    "UNIDAD" => 'salon_array',
    "REGISTRO PROFESOR" => 'asistencia',
    "HORA DE REGISTRO" => 'registro_fecha',
    "NOMBRE SUPERVISOR" => 'usuario_nombre',
    "REGISTRO SUPERVISOR" => 'nombre',
    "HORA DE SUPERVISIÓN" => 'registro_fecha_supervisor',
    "OBSERVACIONES" => 'comentario',
    "JUSTIFICACIÓN" => 'justificacion',
); // Same as before



const ROW = 6;
// Merge cells from A1 to C+ ROW
$sheet->mergeCells('A1:C' . (ROW - 1));
// Merge cells from D1 to size of $data_excel + 1
$sheet->mergeCells('D1:' . chr(65 + count($data_excel) - 1) . (ROW - 1));

// Set the title in D1 Sistema de Auditoría de Asistencia
$sheet->setCellValue('D1', 'Sistema de Auditoría de Asistencia');
$sheet->getStyle('D1')->applyFromArray([
    'font' => [
        'bold' => true,
        'size' => 30,
        'name' => 'Indivisa Text Sans',
        'color' => ['argb' => '001d68'],
    ],
    'alignment' => [
        'vertical' => Alignment::VERTICAL_CENTER,
    ],
]);


$lastColumnLetter = chr(65 + count($data_excel) - 1);
$headers_range = 'A' . ROW . ':' . $lastColumnLetter . ROW;

$keys = array_keys($data_excel);
array_walk($keys, function ($key, $index) use ($sheet) {
    $sheet->setCellValue(chr(65 + $index) . ROW, $key);
});
// Apply the header styles
$sheet->getStyle($headers_range)->applyFromArray([
    'font' => [
        'bold' => true,
        'size' => 12,
        'name' => 'Indivisa Text Sans',
        'color' => ['argb' => Color::COLOR_WHITE],
    ],
    'alignment' => [
        'horizontal' => Alignment::HORIZONTAL_CENTER,
        'vertical' => Alignment::VERTICAL_CENTER,
    ],
    'fill' => [
        'fillType' => Fill::FILL_SOLID,
        'startColor' => ['argb' => '001d68'],
    ]
]);

// set filters
$sheet->setAutoFilter($headers_range);



// Styles that are common for all rows can be set outside the loop

const DEFAULT_FONT = [
    'size' => 10,
    'name' => 'Indivisa Text Sans',
    'color' => ['argb' => '001d68']
];

const DEFAULT_STYLE = [
    'alignment' => [
        'vertical' => Alignment::VERTICAL_CENTER,
        'wrapText' => true,
    ],
    'font' => DEFAULT_FONT,
    'borders' => [
        'outline' => [
            'borderStyle' => Border::BORDER_THIN,
            'color' => ['argb' => Color::COLOR_WHITE],
        ]
    ]
];

function getFormattedValue($key, $registro)
{
    return match ($key) {
        'asistencia' => $registro['registro_fecha'] === null
            ? "Sin registro"
            : ($registro['registro_retardo'] ? "Retardo " : "Asistencia "),
        'registro_fecha',
        'registro_fecha_supervisor' => $registro[$key] === null
            ? 'Sin registro'
            : date('H:i', strtotime($registro[$key])),
        'nombre' => $registro[$key] ?? "Sin registro",
        'horario_hora_completa' => "{$registro['horario_hora']} - {$registro['horario_fin']}",
        'usuario_nombre' => $registro[$key] ?? "Sin registro",
        'salon_array' => $registro[$key],
        'justificacion',
        'comentario' => $registro[$key] ?? "Sin registro",
        'horario_grupo' => $registro[$key] ?? "Sin registro",
        'profesor_correo' => $registro[$key] ?? "Sin correo",
        default => $registro[$key]
    };
}

foreach ($data as $index => $registro) {
    $pair = $index % 2 == 0;
    $cellRange = 'A' . (ROW + $index + 1) . ':' . $lastColumnLetter . (ROW + $index + 1);
    $styleArray = DEFAULT_STYLE;
    $styleArray['fill'] = [
        'fillType' => Fill::FILL_SOLID,
        'startColor' => ['argb' => $pair ? 'd4d9dd' : 'f6f7f8'],
    ];

    $sheet->getStyle($cellRange)->applyFromArray($styleArray);

    $values = array_values($data_excel);

    array_walk($values, function ($row, $column_index) use ($sheet, $index, $registro) {
        $value = getFormattedValue($row, $registro);
        $cellLocation = chr(65 + $column_index) . (ROW + $index + 1);

        $sheet->setCellValue($cellLocation, $value);

        if (in_array($value, ["Sin registro", "Sin asignar", "Sin correo"])) {
            $sheet->getStyle($cellLocation)->applyFromArray(['font' => ['color' => ['argb' => 'ea0029']]]);
        }
    });
}


foreach ($sheet->getColumnIterator() as $column) {
    $colIndex = $column->getColumnIndex();
    if (in_array($colIndex, ['Q', 'R'])) {
        $sheet->getColumnDimension($colIndex)->setWidth(100); // Ajusta el valor según el tamaño deseado
    } else {
        $sheet->getColumnDimension($colIndex)->setAutoSize(true);
    }
}

$writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
$writer->save('php://output');