<?php
require_once("../functions.php");
if (comprobar_override(str_replace($_SERVER['DOCUMENT_ROOT'], '', __FILE__)))
    exit;
$pag = basename($_SERVER['PHP_SELF']);
comprobar_postget("post", ["fecha_ini"], $pag, true, "/views/forms/exportar");
gen_plantilla(true, $pag, false, false, '', false, false);
define("MOSTRAR_APELLIDOS", get_config('mostrar_apellidos_tabla'));

/*******************************************************************************
 *                              [Obtener los datos]                            *
 *******************************************************************************/

$empleado = filter_input(INPUT_POST, "empleado", FILTER_SANITIZE_SPECIAL_CHARS);
$empleado_id = '';
if (!empty($empleado)) {
    // Buscar primero por nombre exacto, luego por nombre completo (nombre + apellidos)
    $empleado_data = consulta("SELECT id FROM empleados WHERE nombre=? OR CONCAT(nombre, ' ', apellidos)=?", [$empleado, $empleado], true);
    if (!empty($empleado_data)) {
        $empleado_id = $empleado_data[0]['id'];
    }
}
$motivo = filter_input(INPUT_POST, "motivo", FILTER_SANITIZE_NUMBER_INT);
$grupo = filter_input(INPUT_POST, "grupo", FILTER_SANITIZE_NUMBER_INT);
$porGrupo = isset($_POST['por_grupo']);
$modoFechas = isset($_POST['fechas']);

if ($modoFechas) {
    $empleado = null;
    $empleado_id = null;
    $grupo = null;
} elseif ($porGrupo) {
    $empleado = null;
    $empleado_id = null;
} else {
    $grupo = null;
}

$f_ini = $_POST['fecha_ini'];
$f_fin = $_POST['fecha_fin'];

// Construcción de la consulta base para traer también el motivo
$colsSubconsulta = ", (SELECT m.nombre 
        FROM aprobaciones_modificaciones_registros amr 
        LEFT JOIN motivos m ON m.id = amr.id_motivo 
        WHERE amr.id_registro = r.id AND amr.id_motivo IS NOT NULL 
        ORDER BY amr.id DESC LIMIT 1) as nombre_motivo";
$colsSubconsultaId = ", (SELECT amr.id_motivo
        FROM aprobaciones_modificaciones_registros amr 
        WHERE amr.id_registro = r.id AND amr.id_motivo IS NOT NULL 
        ORDER BY amr.id DESC LIMIT 1) as id_motivo";

$sql_base = "SELECT r.*, e.apellidos $colsSubconsulta $colsSubconsultaId";
if (SISTEMA_INSPECTOR && $_SESSION["tipo_usuario"] === "inspector") {
    $sql_base = "SELECT r.*, e.apellidos $colsSubconsulta $colsSubconsultaId FROM registros_inspector r";
} else {
    $sql_base = "SELECT r.*, e.apellidos $colsSubconsulta $colsSubconsultaId FROM registros r";
}

$joins = " LEFT JOIN empleados e ON r.id_empleado = e.id ";
if (!SISTEMA_INSPECTOR || (SISTEMA_INSPECTOR && $_SESSION["tipo_usuario"] !== "inspector")) {
    $joins = " INNER JOIN empleados e ON r.id_empleado = e.id "; // Para admins/normal, inner join puede ser mejor si solo queremos empleados activos, pero el original usaba inner/left dependiendo
    if (empty($empleado) && empty($grupo)) {
        $joins = " LEFT JOIN empleados e ON r.id_empleado = e.id ";
    }
}

$where = " WHERE 1=1 ";
$params = [];

// Filtros básicos
if (!SISTEMA_INSPECTOR || (SISTEMA_INSPECTOR && $_SESSION["tipo_usuario"] !== "inspector")) {
    if ($porGrupo && !empty($grupo)) {
        $where .= " AND e.id_grupo = ? ";
        $params[] = $grupo;
    }
}

if (!empty($empleado_id)) {
    $where .= " AND r.id_empleado = ? ";
    $params[] = $empleado_id;
} else if (SISTEMA_INSPECTOR && $_SESSION["tipo_usuario"] === "inspector") {
    // Si es inspector y no seleccionó empleado, ver todos? El original filtraba r.id_empleado si no estaba vacío
}

$where .= " AND r.fecha >= ? AND r.fecha <= ? ";
$params[] = $f_ini;
$params[] = $f_fin;


// Filtro por motivo
if (!empty($motivo) && $motivo != -1) {
    $where .= " HAVING id_motivo = ? ";
    $params[] = $motivo;
}

// Orden
$order = " ORDER BY r.nombre, r.fecha, r.id ";
if ($porGrupo && empty($grupo) && (!SISTEMA_INSPECTOR || $_SESSION["tipo_usuario"] !== "inspector")) {
    $order = " ORDER BY e.id_grupo, r.nombre, r.fecha, r.id ";
}

$registros = consulta($sql_base . $joins . $where . $order, $params, true);


$mostrar_vacios = (int) get_config('mostrar_dias_vacios_exportar') === 1;
$filtrando_motivo = (!empty($motivo) && $motivo != -1);

if ($mostrar_vacios && !$filtrando_motivo) {
    $registros = expandir_con_dias_vacios_csv($registros, $empleado, $f_ini, $f_fin);
}


function rango_fechas_inclusive($ini, $fin)
{
    $out = [];
    $d = new DateTime($ini);
    $lim = new DateTime($fin);
    while ($d <= $lim) {
        $out[] = $d->format('Y-m-d');
        $d->modify('+1 day');
    }
    return $out;
}

/**
 * Expande para incluir días sin fichaje por empleado dentro del rango.
 * - Si se filtró un empleado concreto y no tiene registros en el rango, igualmente se generan líneas vacías.
 * - Mantiene el orden por nombre, fecha, id (los sintéticos van al final por tener id null).
 */
function expandir_con_dias_vacios_csv(array $registros, $empleado, $f_ini, $f_fin)
{
    // Mapa [nombre] => id_empleado
    $empleados_info = [];
    foreach ($registros as $r) {
        if (isset($r['nombre'])) {
            $empleados_info[$r['nombre']] = $r['id_empleado'] ?? null;
        }
    }

    // Si se pidió un único empleado pero no aparece en $registros, intenta obtener su id
    if (!empty($empleado) && !isset($empleados_info[$empleado])) {
        $fila = consulta("SELECT id FROM empleados WHERE nombre=? OR CONCAT(nombre, ' ', apellidos)=? LIMIT 1;", [$empleado, $empleado], true);
        $empleados_info[$empleado] = (!empty($fila) && isset($fila[0]['id'])) ? $fila[0]['id'] : null;
    }

    // Si no hay ningún empleado identificable, no expandimos
    if (empty($empleados_info))
        return $registros;

    // Índice de fechas existentes por empleado
    $presentes = []; // [nombre][Y-m-d] => true
    foreach ($registros as $r) {
        $nom = $r['nombre'] ?? '';
        $fec = isset($r['fecha']) ? (new DateTime($r['fecha']))->format('Y-m-d') : null;
        if ($nom && $fec)
            $presentes[$nom][$fec] = true;
    }

    $todas_fechas = rango_fechas_inclusive($f_ini, $f_fin);
    $faltantes = [];

    foreach ($empleados_info as $nombre => $id_emp) {
        foreach ($todas_fechas as $fec) {
            if (empty($presentes[$nombre][$fec])) {
                $faltantes[] = [
                    'id' => null,
                    'id_empleado' => $id_emp,
                    'nombre' => $nombre,
                    'fecha' => $fec,
                    'hora1' => null,
                    'hora2' => null,
                    'hora3' => null,
                    'hora4' => null,
                    'hora5' => null,
                    'hora6' => null,
                    'hora7' => null,
                    'hora8' => null,
                    'hora9' => null,
                    'hora10' => null,
                    'nombre_motivo' => null // Agregado para consistencia
                ];
            }
        }
    }

    if (!empty($faltantes)) {
        $registros = array_merge($registros, $faltantes);
        usort($registros, function ($a, $b) {
            $cmp = strcmp($a['nombre'], $b['nombre']);
            if ($cmp !== 0)
                return $cmp;
            $cmp = strcmp($a['fecha'], $b['fecha']);
            if ($cmp !== 0)
                return $cmp;
            $ai = $a['id'] ?? PHP_INT_MAX;
            $bi = $b['id'] ?? PHP_INT_MAX;
            return $ai <=> $bi;
        });
    }

    return $registros;
}



$filename = "registros_$f_ini" . '_' . "$f_fin.csv";
$file = fopen($filename, "w");
// BOM para que Excel reconozca UTF-8
fwrite($file, "\xEF\xBB\xBF");
$delim = ";";
$headers = ['Nombre', 'Fecha', 'Hora1', 'Hora2', 'Hora3', 'Hora4', 'Hora5', 'Hora6', 'Hora7', 'Hora8', 'Hora9', 'Hora10', 'Total horas'];

if (!SISTEMA_INCIDENCIAS && get_config('mostrar_horas_excedidas_exportar') !== '0') {
    $headers[] = 'Diferencia';
}

// Comprobar si hay algún motivo en los resultados (siempre que no se haya pedido ocultar)
$mostrar_columna_motivo = false;
if ($motivo != -1) {
    foreach ($registros as $r) {
        if (!empty($r['nombre_motivo'])) {
            $mostrar_columna_motivo = true;
            break;
        }
    }
}

if ($mostrar_columna_motivo) {
    $headers[] = 'Motivo';
}

fputcsv($file, $headers, $delim);


for ($i = 0; $i < count($registros); $i++) {
    // Nombre - mostrar nombre completo si está activa la opción
    $nombre = MOSTRAR_APELLIDOS && !empty($registros[$i]['apellidos'])
        ? $registros[$i]['nombre'] . " " . $registros[$i]['apellidos']
        : $registros[$i]['nombre'];
    $fecha = $registros[$i]['fecha'];

    // Originales (pueden venir como null/00:00:00)
    $raw1 = $registros[$i]['hora1'] ?? null;
    $raw2 = $registros[$i]['hora2'] ?? null;
    $raw3 = $registros[$i]['hora3'] ?? null;
    $raw4 = $registros[$i]['hora4'] ?? null;
    $raw5 = $registros[$i]['hora5'] ?? null;
    $raw6 = $registros[$i]['hora6'] ?? null;
    $raw7 = $registros[$i]['hora7'] ?? null;
    $raw8 = $registros[$i]['hora8'] ?? null;
    $raw9 = $registros[$i]['hora9'] ?? null;
    $raw10 = $registros[$i]['hora10'] ?? null;

    // Visibles en CSV (vacío si null o 00:00:00)
    $hora1 = (!empty($raw1) && $raw1 != '00:00:00') ? substr($raw1, 0, 5) : '';
    $hora2 = (!empty($raw2) && $raw2 != '00:00:00') ? substr($raw2, 0, 5) : '';
    $hora3 = (!empty($raw3) && $raw3 != '00:00:00') ? substr($raw3, 0, 5) : '';
    $hora4 = (!empty($raw4) && $raw4 != '00:00:00') ? substr($raw4, 0, 5) : '';
    $hora5 = (!empty($raw5) && $raw5 != '00:00:00') ? substr($raw5, 0, 5) : '';
    $hora6 = (!empty($raw6) && $raw6 != '00:00:00') ? substr($raw6, 0, 5) : '';
    $hora7 = (!empty($raw7) && $raw7 != '00:00:00') ? substr($raw7, 0, 5) : '';
    $hora8 = (!empty($raw8) && $raw8 != '00:00:00') ? substr($raw8, 0, 5) : '';
    $hora9 = (!empty($raw9) && $raw9 != '00:00:00') ? substr($raw9, 0, 5) : '';
    $hora10 = (!empty($raw10) && $raw10 != '00:00:00') ? substr($raw10, 0, 5) : '';

    $dia_vacio = ($hora1 === '' && $hora2 === '' && $hora3 === '' && $hora4 === '' && $hora5 === '' && $hora6 === '' && $hora7 === '' && $hora8 === '' && $hora9 === '' && $hora10 === '');

    // Si el día está vacío, total vacío; si no, usa tu función
    $total_horas_dia = $dia_vacio ? '' : calculo_horas_totales($raw1, $raw2, $raw3, $raw4, $raw5, $raw6, $raw7, $raw8, $raw9, $raw10);

    $fila_csv = [$nombre, $fecha, $hora1, $hora2, $hora3, $hora4, $hora5, $hora6, $hora7, $hora8, $hora9, $hora10, $total_horas_dia];

    if (!SISTEMA_INCIDENCIAS && get_config('mostrar_horas_excedidas_exportar') !== '0') {
        $diff = '';
        if ($total_horas_dia) {
            $teoricas = calcular_horas_teoricas_dia($registros[$i]['id_empleado'], $registros[$i]['fecha']);
            if ($teoricas) {
                $d = calcular_diferencia_horas($total_horas_dia, $teoricas);
                if ($d != "0")
                    $diff = $d; // solo si diferente
            }
        }
        $fila_csv[] = $diff;
    }

    if ($mostrar_columna_motivo) {
        $fila_csv[] = $registros[$i]['nombre_motivo'] ?? '';
    }

    fputcsv($file, $fila_csv, $delim);
}


fclose($file);

header('Content-Type: text/csv; charset=UTF-8');
header('Content-Disposition: attachment; filename="' . $filename . '";');

readfile($filename);

unlink($filename);
