<?php
if (session_status() === PHP_SESSION_NONE) {
    session_start();
}

date_default_timezone_set('America/Asuncion');

$DB_HOST = 'localhost';
$DB_NAME = 'hm';
$DB_USER = 'root';
$DB_PASS = '';

$conn = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);

if ($conn->connect_error) {
    die('Error de conexión a la base de datos: ' . $conn->connect_error);
}

$conn->set_charset('utf8mb4');

function limpiar($valor)
{
    return trim((string) $valor);
}

function e($valor)
{
    return htmlspecialchars((string) $valor, ENT_QUOTES, 'UTF-8');
}

function numero_entero($valor)
{
    if ($valor === null || $valor === '') {
        return 0;
    }
    return (int) preg_replace('/[^\d-]/', '', (string) $valor);
}

function numero_py($valor)
{
    return number_format((float) $valor, 0, ',', '.');
}

function usuario_actual_id()
{
    return $_SESSION['user_id'] ?? null;
}

function registrar_auditoria($conn, $accion, $tabla_afectada = null, $registro_id = null, $detalle = '')
{
    $usuario_id = usuario_actual_id();
    $ip = $_SERVER['REMOTE_ADDR'] ?? '';
    $sql = 'INSERT INTO auditoria
            (usuario_id, accion, tabla_afectada, registro_id, detalle, ip, creado_en)
            VALUES (?, ?, ?, ?, ?, ?, NOW())';
    $stmt = $conn->prepare($sql);

    if ($stmt) {
        $stmt->bind_param(
            'ississ',
            $usuario_id,
            $accion,
            $tabla_afectada,
            $registro_id,
            $detalle,
            $ip
        );
        $stmt->execute();
        $stmt->close();
    }
}

function sincronizar_descuentos_nominas_abiertas($conn, $colaboradorId)
{
    $buscarNominas = $conn->prepare(
        "SELECT id, periodo FROM nominas
         WHERE colaborador_id=? AND estado<>'Cerrado'"
    );
    $buscarNominas->bind_param('i', $colaboradorId);
    $buscarNominas->execute();
    $nominas = $buscarNominas->get_result();

    $borrarDetalle = $conn->prepare('DELETE FROM nomina_descuentos WHERE nomina_id=?');
    $buscarDescuentos = $conn->prepare(
        "SELECT id, concepto, monto FROM descuentos_recurrentes
         WHERE colaborador_id=? AND activo=1
           AND desde_periodo<=?
           AND (hasta_periodo IS NULL OR hasta_periodo='' OR hasta_periodo>=?)"
    );
    $insertarDetalle = $conn->prepare(
        'INSERT INTO nomina_descuentos
         (nomina_id, descuento_recurrente_id, concepto, monto)
         VALUES (?, ?, ?, ?)'
    );
    $actualizarNomina = $conn->prepare(
        'UPDATE nominas
         SET descuentos=?, total_neto=salario_base+adicionales-?
         WHERE id=? AND estado<>"Cerrado"'
    );

    while ($nomina = $nominas->fetch_assoc()) {
        $nominaId = (int) $nomina['id'];
        $periodo = $nomina['periodo'];
        $borrarDetalle->bind_param('i', $nominaId);
        $borrarDetalle->execute();

        $total = 0.0;
        $buscarDescuentos->bind_param('iss', $colaboradorId, $periodo, $periodo);
        $buscarDescuentos->execute();
        $descuentos = $buscarDescuentos->get_result();
        while ($descuento = $descuentos->fetch_assoc()) {
            $descuentoId = (int) $descuento['id'];
            $concepto = $descuento['concepto'];
            $monto = (float) $descuento['monto'];
            $insertarDetalle->bind_param('iisd', $nominaId, $descuentoId, $concepto, $monto);
            $insertarDetalle->execute();
            $total += $monto;
        }

        $actualizarNomina->bind_param('ddi', $total, $total, $nominaId);
        $actualizarNomina->execute();
    }

    $buscarNominas->close();
    $borrarDetalle->close();
    $buscarDescuentos->close();
    $insertarDetalle->close();
    $actualizarNomina->close();
}

function sincronizar_adicionales_nominas_abiertas($conn, $colaboradorId)
{
    $buscarNominas = $conn->prepare(
        "SELECT id, periodo FROM nominas
         WHERE colaborador_id=? AND estado<>'Cerrado'"
    );
    $buscarNominas->bind_param('i', $colaboradorId);
    $buscarNominas->execute();
    $nominas = $buscarNominas->get_result();

    $borrarDetalle = $conn->prepare('DELETE FROM nomina_adicionales WHERE nomina_id=?');
    $buscarAdicionales = $conn->prepare(
        "SELECT id, concepto, monto FROM adicionales_recurrentes
         WHERE colaborador_id=? AND activo=1
           AND desde_periodo<=?
           AND (hasta_periodo IS NULL OR hasta_periodo='' OR hasta_periodo>=?)"
    );
    $insertarDetalle = $conn->prepare(
        'INSERT INTO nomina_adicionales
         (nomina_id, adicional_recurrente_id, concepto, monto)
         VALUES (?, ?, ?, ?)'
    );
    $actualizarNomina = $conn->prepare(
        'UPDATE nominas
         SET adicionales=?, total_neto=salario_base+?-descuentos
         WHERE id=? AND estado<>"Cerrado"'
    );

    while ($nomina = $nominas->fetch_assoc()) {
        $nominaId = (int) $nomina['id'];
        $periodo = $nomina['periodo'];
        $borrarDetalle->bind_param('i', $nominaId);
        $borrarDetalle->execute();

        $total = 0.0;
        $buscarAdicionales->bind_param('iss', $colaboradorId, $periodo, $periodo);
        $buscarAdicionales->execute();
        $adicionales = $buscarAdicionales->get_result();
        while ($adicional = $adicionales->fetch_assoc()) {
            $adicionalId = (int) $adicional['id'];
            $concepto = $adicional['concepto'];
            $monto = (float) $adicional['monto'];
            $insertarDetalle->bind_param('iisd', $nominaId, $adicionalId, $concepto, $monto);
            $insertarDetalle->execute();
            $total += $monto;
        }

        $actualizarNomina->bind_param('ddi', $total, $total, $nominaId);
        $actualizarNomina->execute();
    }

    $buscarNominas->close();
    $borrarDetalle->close();
    $buscarAdicionales->close();
    $insertarDetalle->close();
    $actualizarNomina->close();
}

function sincronizar_planillas_abiertas_colaborador($conn, $colaboradorId)
{
    sincronizar_descuentos_nominas_abiertas($conn, $colaboradorId);
    sincronizar_adicionales_nominas_abiertas($conn, $colaboradorId);
}

function sincronizar_menus_sistema($conn)
{
    $existe = $conn->query("SHOW TABLES LIKE 'menus_sistema'");
    if (!$existe || !$existe->num_rows) return;
    $menus = require __DIR__ . '/menu_registry.php';
    $stmt = $conn->prepare("INSERT INTO menus_sistema(clave,nombre,ruta,grupo,activo) VALUES(?,?,?,?,1)
      ON DUPLICATE KEY UPDATE nombre=VALUES(nombre),ruta=VALUES(ruta),grupo=VALUES(grupo),activo=1");
    foreach ($menus as $m) {$stmt->bind_param('ssss',$m[0],$m[1],$m[2],$m[3]);$stmt->execute();}
    $stmt->close();
    $conn->query("UPDATE menus_sistema SET activo=0 WHERE clave IN ('facturacion','facturacion_informes','extracto_cliente','obligaciones','extracto_proveedor','extracto_consolidado','tareas')");
    $conn->query("INSERT INTO rol_menus(rol_id,menu_id,habilitado)
      SELECT r.id,m.id,IF(r.nombre='Administrador' OR m.clave='informes_avisos' OR m.grupo='Informes y Avisos',1,0) FROM roles r CROSS JOIN menus_sistema m
      LEFT JOIN rol_menus rm ON rm.rol_id=r.id AND rm.menu_id=m.id
      WHERE rm.rol_id IS NULL");
    $admin = $conn->query("SELECT id FROM roles WHERE nombre='Administrador' LIMIT 1")->fetch_assoc();
    if ($admin) $conn->query("INSERT INTO rol_menus(rol_id,menu_id,habilitado)
      SELECT {$admin['id']},id,1 FROM menus_sistema
      ON DUPLICATE KEY UPDATE habilitado=1");
    $conn->query("UPDATE rol_menus rm JOIN menus_sistema m ON m.id=rm.menu_id
      SET rm.habilitado=1 WHERE m.clave='informes_avisos' OR m.grupo='Informes y Avisos'");
}

function tiene_permiso_menu($conn, $clave)
{
    if (empty($_SESSION['user_id'])) return false;
    if (empty($_SESSION['rol_id'])) {
        $uid=(int)$_SESSION['user_id'];
        $r=$conn->query("SELECT rol_id FROM usuarios WHERE id=$uid")->fetch_assoc();
        $_SESSION['rol_id']=$r['rol_id']??null;
    }
    $rol = $_SESSION['rol_id'] ?? null;
    if (!$rol) return false;
    $stmt=$conn->prepare("SELECT rm.habilitado FROM rol_menus rm JOIN menus_sistema m ON m.id=rm.menu_id WHERE rm.rol_id=? AND m.clave=?");
    $stmt->bind_param('is',$rol,$clave);$stmt->execute();$r=$stmt->get_result()->fetch_assoc();$stmt->close();
    return !empty($r['habilitado']);
}

sincronizar_menus_sistema($conn);
