<?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);

//Comprobar is está sistema de incidencias activo
if(!SISTEMA_INCIDENCIAS){
    crear_notificacion("error", "No tienes acceso a esta página");
    exit;
}

//Fecha inicio y fecha fin de la consulta específica
$fech = consulta("SELECT fecha_inicio,fecha_fin FROM meses_cerrados ORDER BY id DESC LIMIT 1;", null, true);
if (empty($fech)) {
    $fechainicio = date("Y-m-d", strtotime('2020-01-01'));
} else {
    $fechainicio = date("Y-m-d", strtotime($fech[0]["fecha_fin"] . " +1 days"));
}

if (!isset($_POST["fechaanterior"])) $fechafin = date('Y-m-t', strtotime('-1 month'));
else $fechafin = $_POST["fechaanterior"];
if (!isset($_POST["seguir"])) {
    if (!empty(consulta("SELECT id FROM incidencias WHERE estado=1;", [], true))) {
        crear_log(
            "advertencia",
            "Intento cerrar mes",
            $pag,
            "Se ha intentado cerrar mes con incidencias activas."
        );
        crear_notificacion('error', 'No se ha podido cerrar correctamente el mes, hay incidencias');
        exit;
    }
}

//Primero insertar el cierre de mes para obtener su ID
if (!consulta(
    "INSERT INTO `meses_cerrados`(`fecha_inicio`, `fecha_fin`) VALUES (?,?)",
    [$fechainicio, $fechafin],
    false
)) {
    crear_log(
        "error",
        "Error al cerrar mes",
        $pag,
        "No se ha podido insertar el registro de cierre de mes."
    );
    crear_notificacion('error', 'No se ha podido cerrar correctamente el mes');
    exit;
}

//Hacer copia de las horas acumuladas de los empleados
$id_mes_cerrado = consulta('SELECT id FROM meses_cerrados ORDER BY id DESC LIMIT 1;', [], true);
$empleados = consulta('SELECT id,horas_acu FROM empleados;', [], true);
for ($i = 0; $i < count($empleados); $i++) {
    consulta(
        'INSERT INTO `copia_cierre_mes`(`id_cierre`,`id_empleado`, `horas_acu`) VALUES (?,?,?);',
        [
            $id_mes_cerrado[0]['id'],
            $empleados[$i]['id'],
            $empleados[$i]['horas_acu'],
        ],
        false
    );
}

function hToMin(?string $h): int
{
    // Acepta null, "", "8", "08", "8:00", "08:00", "8.00", "8h30", "480" (minutos), etc.
    if ($h === null) return 0;
    $h = trim($h);
    if ($h === '') return 0;

    // Normaliza separadores no estándar a ":"
    $h = str_replace(['.', 'h', 'H'], [':', ':', ':'], $h);

    // Si es un número puro, interpretarlo como minutos (ej. "480")
    if (preg_match('/^\d+$/', $h)) {
        return (int)$h; // minutos
    }

    // Si viene solo la hora (ej. "8" o "08")
    if (preg_match('/^\d{1,2}$/', $h)) {
        return (int)$h * 60;
    }

    // Caso normal H:i
    if (preg_match('/^(\d{1,2}):(\d{1,2})$/', $h, $m)) {
        $H = (int)$m[1];
        $i = (int)$m[2];
        if ($i >= 60) $i = 59; // clamp por si viene "8:75"
        return $H * 60 + $i;
    }

    // Formatos raros (ej. "8:0", "8:") -> intentar dividir con explode de forma segura
    $parts = explode(':', $h);
    if (count($parts) === 2) {
        $H = (int)$parts[0];
        $i = (int)$parts[1];
        return $H * 60 + $i;
    }

    // Si nada encaja, devolver 0 para evitar avisos
    return 0;
}

function compararConMargen(int $realizadasMin, int $objetivoMin, int $margenMin = 15): int
{
    if ($realizadasMin >= $objetivoMin + $margenMin) return 1;
    if ($realizadasMin <= $objetivoMin - $margenMin) return -1;
    return 0;
}
$registros = consulta("SELECT * FROM registros WHERE activo=1 AND fecha>=? AND fecha<=? ORDER BY id;", [$fechainicio, $fechafin], true);

$dias = [1 => 'lun', 2 => 'mar', 3 => 'mie', 4 => 'jue', 5 => 'vie', 6 => 'sab', 7 => 'dom'];

$margenMin = 15;

for ($i = 0; $i < count($registros); $i++) {
    $idempl = consulta(
        "SELECT id FROM `empleados` WHERE nombre=?;",
        [$registros[$i]["nombre"]],
        true
    )[0]["id"];

    $dia = new DateTime($registros[$i]['fecha']);

    // 1) Horas realizadas del día (solo pares válidos; si hay sueltos, calculo_horas_totales debería devolver 0 o ignorarlos)
    $hRealizadasStr = calculo_horas_totales(
        $registros[$i]['hora1'],
        $registros[$i]['hora2'],
        $registros[$i]['hora3'],
        $registros[$i]['hora4'],
        $registros[$i]['hora5'],
        $registros[$i]['hora6']
    );

    // 2) Objetivo de ese día (si viene vacío/0, usar 8:00)
    $hObjetivoStr = get_horas_hace_empleado(
        $registros[$i]['id_empleado'],
        $dias[(int)$dia->format('N')]
    );

    $realizadasMin = hToMin($hRealizadasStr);       // p. ej. 720 = 12h
    $objetivoMin   = hToMin($hObjetivoStr);
    if ($objetivoMin === 0) $objetivoMin = 8 * 60;  // por defecto 8:00

    // 3) Solo sumar extras si te sales del margen por arriba
    if ($realizadasMin >= $objetivoMin + $margenMin) {
        $extrasMin = $realizadasMin - $objetivoMin;

        // ✅ sin redondeo: horas en float con toda la precisión
        if (get_config('minutos_sin_conversion') == '1') {
            // H.MM: 105min → 1.45 (1h 45min)
            $h = floor($extrasMin / 60);
            $m = $extrasMin % 60;
            $extrasHoras = $h + ($m / 100);
        } else {
            $extrasHoras = $extrasMin / 60;
        }

        if ($extrasHoras > 0) {
            if (!consulta(
                "UPDATE `empleados` SET `horas_acu` = horas_acu + ? WHERE id = ?;",
                [(float)$extrasHoras, $idempl],
                false
            )) {
                crear_log(
                    "error",
                    "Error actualizar horas acumuladas",
                    $pag,
                    "No se ha podido sumar horas extras a <b>[{$registros[$i]["nombre"]}]</b> (id <b>[$idempl]</b>)."
                );
            } else {
                crear_log(
                    "info",
                    "Actualizada horas extras",
                    $pag,
                    "Sumadas <b>[{$extrasHoras}]</b> horas extras a <b>[{$registros[$i]["nombre"]}]</b> (id <b>[$idempl]</b>)."
                );
            }
        }
    } else {
        crear_log(
            "info",
            "Sin extras (dentro de margen o por debajo)",
            $pag,
            "Empleado <b>[{$registros[$i]["nombre"]}]</b>: realizadas {$hRealizadasStr}, objetivo {$hObjetivoStr}, margen ±{$margenMin}m."
        );
    }
}



crear_log(
    "info",
    "Se han actualizado las horas extras",
    $pag,
    "Se han actualizado las horas extras y cerrado el mes correctamente."
);
crear_notificacion('correcto', 'Mes cerrado correctamente');
