<?php
require_once "../../functions.php";
$pag = basename($_SERVER['PHP_SELF']);
if (comprobar_override(str_replace($_SERVER['DOCUMENT_ROOT'], '', __FILE__)))
    exit;
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 = filter_input(INPUT_POST, "id", FILTER_SANITIZE_NUMBER_INT);

//Obtener registros actuales sin cambiar
if (!isset($_POST['inspector']))
    $registro_ant = consulta('SELECT * FROM registros WHERE id=?;', [$id], true);
else
    $registro_ant = consulta('SELECT * FROM registros_inspector WHERE id=?;', [$id], true);

$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;

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

//comparar en las horas originales y las modificadas, si en las originales habia una hora que ya no está en la nueva establece a 00:00
for ($i = 0; $i < 10; $i++) {
    if (!empty($horas_originales[$i]) && ($horas_modificar[$i] === null)) {
        $horas_modificar[$i] = '00:00:00';
    }
}


/* -------------------------------------------------------------------------- */
/*                        CALCULO DE HORAS ACUMULADAS                         */
/* -------------------------------------------------------------------------- */
// Solo si no es inspector y no está activo el sistema de incidencias
if (!isset($_POST['inspector'])) {
    $fecha_registro = $registro_ant[0]['fecha'];
    $hoy = date('Y-m-d');

    // Si la fecha del registro no es hoy (es una fecha pasada)
    if ($fecha_registro < $hoy) {
        $id_empleado = $registro_ant[0]['id_empleado'];

        // Obtener datos del empleado y grupo
        $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
                // si es anterior a esta semana
                $inicio_semana_actual = date('Y-m-d', strtotime('monday this week'));
                if ($fecha_registro < $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) {
                // Calcular total horas antiguas
                // OJO: calculo_horas_totales devuelve string HH:MM o false. Necesitamos segundos o decimales para restar.
                // Como la función devuelve HH:MM, convertiremos a minutos para operar.

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

                $total_ant = calculo_horas_totales(
                    $horas_originales[0],
                    $horas_originales[1],
                    $horas_originales[2],
                    $horas_originales[3],
                    $horas_originales[4],
                    $horas_originales[5],
                    $horas_originales[6],
                    $horas_originales[7],
                    $horas_originales[8],
                    $horas_originales[9]
                );

                $total_nue = calculo_horas_totales(
                    $horas_modificar[0],
                    $horas_modificar[1],
                    $horas_modificar[2],
                    $horas_modificar[3],
                    $horas_modificar[4],
                    $horas_modificar[5],
                    $horas_modificar[6],
                    $horas_modificar[7],
                    $horas_modificar[8],
                    $horas_modificar[9]
                );

                $min_ant = $horasToMinutos($total_ant);
                $min_nue = $horasToMinutos($total_nue);

                // Replicar exactamente la lógica del cron para calcular los EXTRAS (positivos o negativos) según las horas teóricas
                $dias_map = [1=>'lun', 2=>'mar', 3=>'mie', 4=>'jue', 5=>'vie', 6=>'sab', 7=>'dom'];
                $dia_num = (new DateTime($fecha_registro))->format('N');
                $h_teoricas_str = get_horas_hace_empleado($id_empleado, $dias_map[(int)$dia_num]);
                
                $parseMin = function($h) {
                    if (!$h) return 0;
                    $parts = explode(':', str_replace(['.','h','H'], [':',':',':'], $h));
                    if(count($parts) >= 2) return ((int)$parts[0] * 60) + (int)$parts[1];
                    if(preg_match('/^\d+$/', $h)) return (int)$h;
                    return 0;
                };

                $min_teoricos = $parseMin($h_teoricas_str);

                if ($min_teoricos == 0) {
                    // Si no tiene horario, todo es extra positivo
                    $old_extras_min = $min_ant;
                    $new_extras_min = $min_nue;
                } else {
                    $tolerancia_minutos = (int)(get_config('minutos_tolerancia_fichaje') ?? 15);
                    $minimo_minutos_acumulables = (int)(get_config('minimo_minutos_acumulables') ?? 15);
                    $intervalo_redondeo_min = $tolerancia_minutos > 0 ? $tolerancia_minutos : 15;

                    $calcular_impacto_min = function($realizadas, $teoricas) use ($tolerancia_minutos, $minimo_minutos_acumulables, $intervalo_redondeo_min) {
                        $dif = $realizadas - $teoricas;
                        if ($realizadas > $teoricas + $tolerancia_minutos && abs($dif) >= $minimo_minutos_acumulables) {
                            return floor($dif / $intervalo_redondeo_min) * $intervalo_redondeo_min;
                        } elseif ($realizadas < $teoricas - $tolerancia_minutos && abs($dif) >= $minimo_minutos_acumulables) {
                            return floor(abs($dif) / $intervalo_redondeo_min) * $intervalo_redondeo_min * -1;
                        }
                        return 0;
                    };

                    $old_extras_min = $calcular_impacto_min($min_ant, $min_teoricos);
                    $new_extras_min = $calcular_impacto_min($min_nue, $min_teoricos);
                }

                // Convertir viejo y nuevo a formato decimal
                $minToDec = function($min) {
                    if (get_config('minutos_sin_conversion') == '1') {
                        $h = floor(abs($min) / 60);
                        $m = abs($min) % 60;
                        return ($min < 0 ? -1 : 1) * ($h + ($m / 100));
                    } else {
                        return $min / 60;
                    }
                };

                $old_extras_dec = $minToDec($old_extras_min);
                $new_extras_dec = $minToDec($new_extras_min);

                $diferencia_horas_dec = $new_extras_dec - $old_extras_dec;

                if ($diferencia_horas_dec != 0) {
                    // 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);

                    // Si el admin modifica y hay extras viejos, registrar reversión
                    if ($old_extras_dec != 0) { // Ahora puede ser negativo también si había déficit
                        consulta(
                            "INSERT INTO historial_horas_acumuladas_cron (id_empleado, horas_ant, horas, fecha) VALUES (?, ?, ?, ?);",
                            [$id_empleado, $horas_ant, -$old_extras_dec, $fecha_registro],
                            false
                        );
                        $horas_ant -= $old_extras_dec; // Actualizar base para el siguiente
                    }

                    // Registrar los nuevos extras
                    if ($new_extras_dec != 0) {
                        consulta(
                            "INSERT INTO historial_horas_acumuladas_cron (id_empleado, horas_ant, horas, fecha) VALUES (?, ?, ?, ?);",
                            [$id_empleado, $horas_ant, $new_extras_dec, $fecha_registro],
                            false
                        );
                    }

                    // Si no había extras viejos ni nuevos pero hubo diferencia, loguear la diferencia neta (caso de grupos flexibles / sin horario)
                    if ($old_extras_dec == 0 && $new_extras_dec == 0 && $diferencia_horas_dec != 0) {
                        consulta(
                            "INSERT INTO historial_horas_acumuladas_cron (id_empleado, horas_ant, horas, fecha) VALUES (?, ?, ?, ?);",
                            [$id_empleado, $horas_ant, $diferencia_horas_dec, $fecha_registro],
                            false
                        );
                    }

                    crear_log(
                        "info",
                        "Recálculo horas acumuladas (Cron Exacto)",
                        $pag,
                        "Se actualizó horas acumuladas empleado $id_empleado. (Viejo: {$old_extras_dec}h, Nuevo: {$new_extras_dec}h, Neto: {$diferencia_horas_dec}h)."
                    );
                }
            }
        }
    }
}
/* -------------------------------------------------------------------------- */


/*******************************************************************************
 *                                 [Consulta]                                  *
 *******************************************************************************/
if (!isset($_POST['inspector'])) {
    if (
        !consulta(
            "UPDATE registros SET `hora1`=?,`hora2`=?,`hora3`=?,`hora4`=?,`hora5`=?,`hora6`=?,`hora7`=?,`hora8`=?,`hora9`=?,`hora10`=? WHERE id=?;",
            [$hora1, $hora2, $hora3, $hora4, $hora5, $hora6, $hora7, $hora8, $hora9, $hora10, $id],
            false
        )
    ) {
        crear_log(
            "error",
            "Error en la consulta",
            $pag,
            "No se ha podido actualizar la ficha, porque ha ocurrido un error en la consulta."
        );
        crear_notificacion("error", "No se ha podido actualizar el registro");
    } else {
        crear_log(
            "info",
            "Registro actualizada",
            $pag,
            "Se ha modificado el registro con id <b>[$id]</b>."
        );

        if (!isset($_POST['no_mostrar_aprobaciones'])) {
            $id_motivo = filter_input(INPUT_POST, 'id_motivo', FILTER_SANITIZE_NUMBER_INT);
            //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`,
        `h1_modificada`, `h2_modificada`, `h3_modificada`, `h4_modificada`, `h5_modificada`, `h6_modificada`, `h7_modificada`, `h8_modificada`, `h9_modificada`, `h10_modificada`,
        `tipo`,`id_empleado`, `id_motivo`)
        VALUES (?,
        ?,?,?,?,?,?,?,?,?,?,
        ?,?,?,?,?,?,?,?,?,?,
        "modificar",?,?);',
                    [$id, ...$horas_originales, ...$horas_modificar, $registro_ant[0]['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, ...$horas_modificar, $registro_ant[0]['id_empleado']], JSON_UNESCAPED_UNICODE) . "]."
                );
                crear_notificacion("correcto", "Registro actualizado, pero no se ha podido guardar en aprobaciones");
                echo "<script>animacion_y_cierre_dialog();</script>";
            } else {
                crear_log(
                    "info",
                    "Aprobación guardada",
                    $pag,
                    "Se ha guardado la aprobación con los siguientes datos [" . json_encode([$id, ...$horas_originales, ...$horas_modificar, $registro_ant[0]['id_empleado']], JSON_UNESCAPED_UNICODE) . "]."
                );
                if (SISTEMA_INSPECTOR) {
                    $id = consulta('SELECT id FROM registros_inspector WHERE id_empleado=? AND fecha=? AND activo=1;', [$registro_ant[0]['id_empleado'], $registro_ant[0]['fecha']], true);
                    if (empty($id)) {
                        crear_log(
                            "error",
                            "Error en la consulta",
                            $pag,
                            "No se ha podido actualizar el registro i, porque ha ocurrido un error en la consulta o no existe."
                        );
                        crear_notificacion("advertencia", "No se ha podido actualizar el registro inspector, registro no existe");
                        exit;
                    }
                    $id = $id[0]['id'];
                    if (
                        !consulta(
                            "UPDATE registros_inspector SET `hora1`=?,`hora2`=?,`hora3`=?,`hora4`=?,`hora5`=?,`hora6`=?,`hora7`=?,`hora8`=?,`hora9`=?,`hora10`=? WHERE id=?;",
                            [$hora1, $hora2, $hora3, $hora4, $hora5, $hora6, $hora7, $hora8, $hora9, $hora10, $id],
                            false
                        )
                    ) {
                        crear_log(
                            "error",
                            "Error en la consulta",
                            $pag,
                            "No se ha podido actualizar el registro i, porque ha ocurrido un error en la consulta."
                        );
                        crear_notificacion("error", "No se ha podido actualizar el registro inspector");
                    } else {
                        crear_log(
                            "info",
                            "Registro actualizada",
                            $pag,
                            "Se ha modificado el registro i con id <b>[$id]</b>."
                        );
                        crear_notificacion("correcto", "Registro actualizado correctamente");
                        echo "<script>animacion_y_cierre_dialog();</script>";
                    }
                } else {
                    crear_notificacion("correcto", "Registro actualizado correctamente");
                    echo "<script>animacion_y_cierre_dialog();</script>";
                }
            }
        } else {
            crear_notificacion("correcto", "Registro actualizado correctamente");
            echo "<script>animacion_y_cierre_dialog();</script>";
        }
    }
} else {
    if (
        !consulta(
            "UPDATE registros_inspector SET `hora1`=?,`hora2`=?,`hora3`=?,`hora4`=?,`hora5`=?,`hora6`=?,`hora7`=?,`hora8`=?,`hora9`=?,`hora10`=? WHERE id=?;",
            [$hora1, $hora2, $hora3, $hora4, $hora5, $hora6, $hora7, $hora8, $hora9, $hora10, $id],
            false
        )
    ) {
        crear_log(
            "error",
            "Error en la consulta",
            $pag,
            "No se ha podido actualizar el registro i, porque ha ocurrido un error en la consulta."
        );
        crear_notificacion("error", "No se ha podido actualizar el registro");
    } else {
        crear_log(
            "info",
            "Registro actualizada",
            $pag,
            "Se ha modificado el registro i con id <b>[$id]</b>."
        );
        crear_notificacion("correcto", "Registro actualizado correctamente");
        echo "<script>animacion_y_cierre_dialog();</script>";
    }
}
