<?php
require_once "../../functions.php";
if (comprobar_override(str_replace($_SERVER['DOCUMENT_ROOT'], '', __FILE__)))
    exit;
$pag = basename($_SERVER['PHP_SELF']);
comprobar_postget("post", ["id_empleado", "hora1"], $pag, false, '');
gen_plantilla(true, $pag, false, false, '', false, false);

if (session_status() !== PHP_SESSION_ACTIVE) session_start();
if (!isset($_SESSION['tipo_usuario']) || ($_SESSION['tipo_usuario'] !== 'admin' && $_SESSION['tipo_usuario'] !== 'inspector')) {
    crear_notificacion("error", "No tienes permisos para realizar esta acción");
    exit;
}
/*******************************************************************************
 *                               [Parámetros]                                  *
 *******************************************************************************/

$id_empleado = filter_input(INPUT_POST, "id_empleado", FILTER_SANITIZE_NUMBER_INT);
$nombre = consulta("SELECT nombre FROM empleados WHERE id=?;", [$id_empleado], true)[0]["nombre"];
$hora1 = filter_input(INPUT_POST, "hora1", FILTER_SANITIZE_SPECIAL_CHARS);
if ($hora1 == "" || $hora1 == "00:00") {
    crear_notificacion("error", "La primera hora es obligatoria");
    exit;
}
$hora2 = filter_input(INPUT_POST, "hora2", FILTER_SANITIZE_SPECIAL_CHARS);
$hora2 = ($hora2 == "" || $hora2 == "00:00") ? null : $hora2;
$hora3 = filter_input(INPUT_POST, "hora3", FILTER_SANITIZE_SPECIAL_CHARS);
$hora3 = ($hora3 == "" || $hora3 == "00:00") ? null : $hora3;
$hora4 = filter_input(INPUT_POST, "hora4", FILTER_SANITIZE_SPECIAL_CHARS);
$hora4 = ($hora4 == "" || $hora4 == "00:00") ? null : $hora4;
$hora5 = filter_input(INPUT_POST, "hora5", FILTER_SANITIZE_SPECIAL_CHARS);
$hora5 = ($hora5 == "" || $hora5 == "00:00") ? null : $hora5;
$hora6 = filter_input(INPUT_POST, "hora6", FILTER_SANITIZE_SPECIAL_CHARS);
$hora6 = ($hora6 == "" || $hora6 == "00:00") ? null : $hora6;
$hora7 = filter_input(INPUT_POST, "hora7", FILTER_SANITIZE_SPECIAL_CHARS);
$hora7 = ($hora7 == "" || $hora7 == "00:00") ? null : $hora7;
$hora8 = filter_input(INPUT_POST, "hora8", FILTER_SANITIZE_SPECIAL_CHARS);
$hora8 = ($hora8 == "" || $hora8 == "00:00") ? null : $hora8;
$hora9 = filter_input(INPUT_POST, "hora9", FILTER_SANITIZE_SPECIAL_CHARS);
$hora9 = ($hora9 == "" || $hora9 == "00:00") ? null : $hora9;
$hora10 = filter_input(INPUT_POST, "hora10", FILTER_SANITIZE_SPECIAL_CHARS);
$hora10 = ($hora10 == "" || $hora10 == "00:00") ? null : $hora10;
$fecha = filter_input(INPUT_POST, "fecha", FILTER_SANITIZE_SPECIAL_CHARS);
$id_motivo = filter_input(INPUT_POST, "id_motivo", FILTER_SANITIZE_NUMBER_INT) ?? 1;

$horas_originales = [$hora1, $hora2, $hora3, $hora4, $hora5, $hora6, $hora7, $hora8, $hora9, $hora10];


/*******************************************************************************
 *                                 [Consulta]                                  *
 *******************************************************************************/

//Comprobar si existe registro activo de esta fecha con este empleado, si ya existe no lo crea
$registro_existente = consulta("SELECT * FROM registros WHERE id_empleado=? AND fecha=? AND activo=1;", [$id_empleado, $fecha], true);


if (!empty($registro_existente)) {
    crear_notificacion('error', 'Ya existe un registro para este empleado en esta fecha');
    exit;
}

/* -------------------------------------------------------------------------- */
/*                        CALCULO DE HORAS ACUMULADAS                         */
/* -------------------------------------------------------------------------- */
// Solo si no es inspector y no está activo el sistema de incidencias
if ((!SISTEMA_INSPECTOR || (SISTEMA_INSPECTOR && isset($_POST['no_mostrar_aprobaciones'])))) { // Asumo que si estamos creando normal (tipo != inspector) o si es admin creando.
    // La variable SISTEMA_INSPECTOR es una constante global.
    // Mejor comprobamos el contexto. crear_registro.php se llama desde admin o app.
    // Si la creacion es para "registros" (tabla principal), aplicamos.

    $hoy = date('Y-m-d');

    if ($fecha < $hoy) {
        $empleado_data = consulta("SELECT id_grupo, sin_horario_asignado FROM empleados WHERE id=?", [$id_empleado], true);
        if (!empty($empleado_data)) {
            $id_grupo = $empleado_data[0]['id_grupo'];
            $sin_horario = $empleado_data[0]['sin_horario_asignado'];

            $grupo_data = [];
            if (!empty($id_grupo)) {
                $grupo_data = consulta("SELECT tipo_grupo, tipo_flexible FROM grupos WHERE id=?", [$id_grupo], true);
            }

            $es_flexible_semanal = (!empty($grupo_data) && $grupo_data[0]['tipo_grupo'] == 1 && $grupo_data[0]['tipo_flexible'] == 2);

            $proceder = false;

            if (!$es_flexible_semanal) {
                // Si no es grupo semanal, se añade o resta siempre
                $proceder = true;
            } else {
                // Si es semanal
                $inicio_semana_actual = date('Y-m-d', strtotime('monday this week'));
                if ($fecha < $inicio_semana_actual) {
                    // en el caso de que no tenga horario fijo del empleado y pertenezca a un grupo flexible semanal
                    if ($sin_horario == 1) {
                        $proceder = true;
                    }
                }
            }



            if ($proceder) {
                $horasToMinutos2 = function($h)
                {
                    if (!$h)
                        return 0;
                    $parts = explode(':', $h);
                    return ($parts[0] * 60) + $parts[1];
                };

                $total_nue = calculo_horas_totales(
                    $hora1,
                    $hora2,
                    $hora3,
                    $hora4,
                    $hora5,
                    $hora6,
                    $hora7,
                    $hora8,
                    $hora9,
                    $hora10
                );

                $min_nue = $horasToMinutos2($total_nue);

                if ($min_nue > 0) {
                    if (get_config('minutos_sin_conversion') == '1') {
                        $h = floor($min_nue / 60);
                        $m = $min_nue % 60;
                        $diferencia_horas_dec = $h + ($m / 100);
                    } else {
                        $diferencia_horas_dec = $min_nue / 60;
                    }

                    // Obtener las horas acumuladas antes del cambio
                    $emp_ant = consulta("SELECT horas_acu FROM empleados WHERE id=?", [$id_empleado], true);
                    $horas_ant = !empty($emp_ant) ? (float)$emp_ant[0]['horas_acu'] : 0;

                    consulta("UPDATE empleados SET horas_acu = horas_acu + ? WHERE id=?", [$diferencia_horas_dec, $id_empleado], false);

                    // Registrar en el historial del sistema (cron)
                    consulta(
                        "INSERT INTO historial_horas_acumuladas_cron (id_empleado, horas_ant, horas, fecha) VALUES (?, ?, ?, ?);",
                        [$id_empleado, $horas_ant, $diferencia_horas_dec, $fecha],
                        false
                    );

                    crear_log(
                        "info",
                        "Recálculo horas acumuladas (Creación)",
                        $pag,
                        "Se han sumado $diferencia_horas_dec horas a las acumuladas del empleado $id_empleado por creación de registro pasado ($fecha)."
                    );
                }
            }
        }
    }
}
/* -------------------------------------------------------------------------- */


if (
    !consulta( //Actualizado beta 24w23e
        "INSERT INTO `registros`(`nombre`,`id_empleado`, `hora1`, `hora2`, `hora3`, `hora4`, `hora5`, `hora6`, `hora7`, `hora8`, `hora9`, `hora10`,
    `fecha`)
    VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)",
        [$nombre, $id_empleado, $hora1, $hora2, $hora3, $hora4, $hora5, $hora6, $hora7, $hora8, $hora9, $hora10, $fecha],
        false
    )
) {
    crear_log(
        "error",
        "Error al crear el registro",
        $pag,
        "Error al crear el registro"
    );
    crear_notificacion('error', 'Error al crear el registro');
} else {
    if (SISTEMA_INSPECTOR) {
        if (
            !consulta(
                "INSERT INTO `registros_inspector`(`nombre`,`id_empleado`, `hora1`, `hora2`, `hora3`, `hora4`, `hora5`,
         `hora6`, `hora7`, `hora8`, `hora9`, `hora10`, `fecha`)
        VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)",
                [$nombre, $id_empleado, $hora1, $hora2, $hora3, $hora4, $hora5, $hora6, $hora7, $hora8, $hora9, $hora10, $fecha],
                false
            )
        ) {
            crear_log(
                "error",
                "Error al crear el registro inspector",
                $pag,
                "Error al crear el registro para el modo inspector"
            );
        }
    }

    $id = consulta('SELECT id FROM registros ORDER BY id DESC LIMIT 1;', [], true)[0]['id'];

    if (!isset($_POST['no_mostrar_aprobaciones'])) {
        //Guardar modificación de registro para aprobación del empleado
        if (
            !consulta(
                'INSERT INTO `aprobaciones_modificaciones_registros`(`id_registro`,
        `h1_original`, `h2_original`, `h3_original`, `h4_original`, `h5_original`, `h6_original`, `h7_original`, `h8_original`, `h9_original`, `h10_original`,
        `tipo`,`id_empleado`,`id_motivo`)
        VALUES (?,
        ?,?,?,?,?,?,?,?,?,?,
        "crear",?,?);',
                [$id, ...$horas_originales, $id_empleado, $id_motivo],
                false
            )
        ) {
            crear_log(
                "error",
                "Error al guardarlo en aprobaciones",
                $pag,
                "No se ha podido guardar la aprobación con los siguientes datos [" . json_encode([$id, ...$horas_originales, $id_empleado, $id_motivo], JSON_UNESCAPED_UNICODE) . "]."
            );
            crear_notificacion("correcto", "Registro creado, pero no se ha podido guardar en aprobaciones");
        } else {
            crear_log(
                "info",
                "Aprobación guardada",
                $pag,
                "Se ha guardado la aprobación con los siguientes datos [" . json_encode([$id, ...$horas_originales, $id_empleado, $id_motivo], JSON_UNESCAPED_UNICODE) . "]."
            );
            crear_notificacion("correcto", "Registro creado correctamente");
        }
    } else
        crear_notificacion("correcto", "Registro creado correctamente");
}
