<?php
/**
 * Archivo para manejar la subida de documentos a OpenKM
 * Versión OpenKM: 6.3.11
 * Usuario: okmAdmin
 * Clave: admin
 * URL Base: https://srvdgx3.midatech.cl/OpenKM/
 * Estructura: https://srvdgx3.midatech.cl/uploadgx/Carpeta/{rut}_{apellido_paterno}/
 * 
 * NOTA: La API REST de OpenKM 6.3.11 no está funcionando correctamente (HTTP 405/415),
 * por lo que se sube directamente al sistema de archivos donde OpenKM está montado.
 */

/**
 * Función para verificar si existe una carpeta en OpenKM
 */
function verificarCarpetaOpenKM($rutaCarpeta) {
    $url = 'https://srvdgx3.midatech.cl/OpenKM/services/rest/folder/getProperties?fldId=' . urlencode($rutaCarpeta);
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_USERPWD, 'okmAdmin:admin');
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $error = curl_error($ch);
    curl_close($ch);
    
    if ($httpCode == 200) {
        return true;
    } else {
        error_log("Carpeta no existe o error: HTTP $httpCode - $error - Ruta: $rutaCarpeta");
        return false;
    }
}

/**
 * Función para crear una carpeta en OpenKM
 */
function crearCarpetaOpenKM($rutaCarpeta) {
    // Método 1: Intentar con POST y JSON (más estándar para OpenKM 6.3.11)
    $url = 'https://srvdgx3.midatech.cl/OpenKM/services/rest/folder/createSimple';
    $data = json_encode(['fldPath' => $rutaCarpeta]);
    
    error_log("Intentando crear carpeta con POST JSON: $url");
    error_log("Ruta carpeta: $rutaCarpeta");
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_USERPWD, 'okmAdmin:admin');
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'Content-Type: application/json; charset=UTF-8',
        'Accept: application/json'
    ]);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $error = curl_error($ch);
    curl_close($ch);
    
    error_log("Respuesta crear carpeta (POST JSON): HTTP $httpCode - $response");
    
    if ($httpCode == 200 || $httpCode == 201) {
        error_log("Carpeta creada exitosamente en OpenKM: $rutaCarpeta");
        return true;
    }
    
    // Si el error es que la carpeta ya existe, considerarlo éxito
    $responseLower = strtolower($response);
    if (strpos($responseLower, 'already exists') !== false || 
        strpos($responseLower, 'ya existe') !== false ||
        strpos($responseLower, 'exists') !== false ||
        $httpCode == 409) {
        error_log("Carpeta ya existe en OpenKM (HTTP $httpCode): $rutaCarpeta");
        return true;
    }
    
    // Si el error es PathNotFoundException, crear la carpeta padre primero
    if (strpos($response, 'PathNotFoundException') !== false || $httpCode == 500) {
        $carpetaPadre = dirname($rutaCarpeta);
        if ($carpetaPadre != $rutaCarpeta && $carpetaPadre != '/okm:root' && $carpetaPadre != '.') {
            error_log("La carpeta padre no existe, creando primero: $carpetaPadre");
            if (crearCarpetaOpenKM($carpetaPadre)) {
                // Reintentar crear la carpeta después de crear la padre
                error_log("Reintentando crear carpeta después de crear la padre: $rutaCarpeta");
                return crearCarpetaOpenKM($rutaCarpeta);
            }
        }
    }
    
    // Si falla, intentar con GET como alternativa
    error_log("Método POST JSON falló, intentando GET...");
    
    $url = 'https://srvdgx3.midatech.cl/OpenKM/services/rest/folder/createSimple';
    $url .= '?fldPath=' . urlencode($rutaCarpeta);
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_USERPWD, 'okmAdmin:admin');
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $error = curl_error($ch);
    curl_close($ch);
    
    error_log("Respuesta crear carpeta (GET): HTTP $httpCode - $response");
    
    if ($httpCode == 200 || $httpCode == 201) {
        error_log("Carpeta creada exitosamente en OpenKM: $rutaCarpeta");
        return true;
    }
    
    // Si el error es que la carpeta ya existe, considerarlo éxito
    $responseLower = strtolower($response);
    if (strpos($responseLower, 'already exists') !== false || 
        strpos($responseLower, 'ya existe') !== false ||
        strpos($responseLower, 'exists') !== false ||
        $httpCode == 409) {
        error_log("Carpeta ya existe en OpenKM (HTTP $httpCode): $rutaCarpeta");
        return true;
    }
    
    // Si ambos métodos fallan, retornar false
    error_log("Error al crear carpeta OpenKM: HTTP $httpCode - $error - Respuesta: $response - Ruta: $rutaCarpeta");
    return false;
}

/**
 * Función para subir un documento directamente al sistema de archivos
 * (OpenKM 6.3.11: La API REST no está funcionando correctamente, se sube directamente)
 */
function subirDocumentoOpenKM($rutaCarpeta, $nombreArchivo, $archivoTemporal) {
    // Extraer el nombre de la carpeta del trabajador (ya viene formateado)
    $nombreCarpeta = basename($rutaCarpeta); // Ej: "17969616-9-DE_PRUEBA"
    
    error_log("subirDocumentoOpenKM - Nombre carpeta: $nombreCarpeta");
    error_log("subirDocumentoOpenKM - Nombre archivo: $nombreArchivo");
    error_log("subirDocumentoOpenKM - Archivo temporal: $archivoTemporal");
    
    // Verificar que el archivo temporal existe
    if (!file_exists($archivoTemporal)) {
        throw new Exception('El archivo temporal no existe: ' . $archivoTemporal);
    }
    
    // IMPORTANTE: Solo tenemos acceso a OpenKM, NO al sistema de archivos directo
    // Debemos usar la API REST de OpenKM 6.3.11 para subir a srvdgx3.midatech.cl/uploadgx/Carpeta/
    
    // Construir la ruta del documento en OpenKM
    $rutaDocumento = $rutaCarpeta . '/' . $nombreArchivo;
    
    // Leer el contenido del archivo y codificarlo en base64
    $contenidoArchivo = file_get_contents($archivoTemporal);
    if ($contenidoArchivo === false) {
        throw new Exception('No se pudo leer el archivo temporal');
    }
    $contenidoBase64 = base64_encode($contenidoArchivo);
    
    error_log("Subiendo documento a OpenKM 6.3.11 para srvdgx3.midatech.cl/uploadgx/Carpeta/");
    error_log("Ruta documento en OpenKM: $rutaDocumento");
    error_log("Nombre archivo: $nombreArchivo");
    error_log("Tamaño del archivo: " . filesize($archivoTemporal) . " bytes");
    
    // Las URLs que dan HTTP 405 (Method Not Allowed) existen pero no aceptan POST
    // Probaremos con GET primero, luego con otros métodos
    $urls405 = [
        'https://srvdgx3.midatech.cl/OpenKM/services/rest/document/createSimple',
        'https://srvdgx3.midatech.cl/OpenKM/services/rest/document/create'
    ];
    
    $httpCode = 0;
    $response = '';
    $error = '';
    $urlExitoso = '';
    
    // Método 1: Probar con GET (los endpoints que dan 405 pueden aceptar GET)
    foreach ($urls405 as $url) {
        error_log("Probando URL (GET): $url");
        
        $urlConParametros = $url . '?docPath=' . urlencode($rutaDocumento) . '&content=' . urlencode($contenidoBase64);
        
        // Verificar si la URL es demasiado larga
        if (strlen($urlConParametros) > 2000) {
            error_log("URL demasiado larga para GET, intentando POST...");
            // Continuar con POST más abajo
            break;
        }
        
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $urlConParametros);
        curl_setopt($ch, CURLOPT_POST, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_USERPWD, 'okmAdmin:admin');
        curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
        curl_setopt($ch, CURLOPT_TIMEOUT, 120);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        
        $response = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        $error = curl_error($ch);
        curl_close($ch);
        
        error_log("Respuesta ($url - GET): HTTP $httpCode");
        error_log("Respuesta completa: " . substr($response, 0, 500));
        
        if ($httpCode == 200 || $httpCode == 201) {
            $urlExitoso = $url;
            error_log("¡Éxito con GET! URL que funcionó: $url");
            break;
        }
    }
    
    // Método 2: Si GET no funcionó, probar con PUT
    if ($httpCode != 200 && $httpCode != 201) {
        foreach ($urls405 as $url) {
            error_log("Probando URL (PUT): $url");
            
            $postFields = 'docPath=' . urlencode($rutaDocumento) . '&content=' . urlencode($contenidoBase64);
            
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
            curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_USERPWD, 'okmAdmin:admin');
            curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
            curl_setopt($ch, CURLOPT_HTTPHEADER, [
                'Content-Type: application/x-www-form-urlencoded; charset=UTF-8'
            ]);
            curl_setopt($ch, CURLOPT_TIMEOUT, 120);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
            
            $response = curl_exec($ch);
            $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            $error = curl_error($ch);
            curl_close($ch);
            
            error_log("Respuesta ($url - PUT): HTTP $httpCode");
            error_log("Respuesta completa: " . substr($response, 0, 500));
            
            if ($httpCode == 200 || $httpCode == 201) {
                $urlExitoso = $url;
                error_log("¡Éxito con PUT! URL que funcionó: $url");
                break;
            }
        }
    }
    
    // Método 3: Si PUT no funcionó, probar con POST pero con XML
    if ($httpCode != 200 && $httpCode != 201) {
        foreach ($urls405 as $url) {
            error_log("Probando URL (POST con XML): $url");
            
            $xml = '<?xml version="1.0" encoding="UTF-8"?>' . "\n";
            $xml .= '<document>' . "\n";
            $xml .= '  <docPath>' . htmlspecialchars($rutaDocumento, ENT_XML1, 'UTF-8') . '</docPath>' . "\n";
            $xml .= '  <content>' . $contenidoBase64 . '</content>' . "\n";
            $xml .= '</document>';
            
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_USERPWD, 'okmAdmin:admin');
            curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
            curl_setopt($ch, CURLOPT_HTTPHEADER, [
                'Content-Type: application/xml; charset=UTF-8',
                'Accept: application/xml'
            ]);
            curl_setopt($ch, CURLOPT_TIMEOUT, 120);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
            
            $response = curl_exec($ch);
            $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            $error = curl_error($ch);
            curl_close($ch);
            
            error_log("Respuesta ($url - POST XML): HTTP $httpCode");
            error_log("Respuesta completa: " . substr($response, 0, 500));
            
            if ($httpCode == 200 || $httpCode == 201) {
                $urlExitoso = $url;
                error_log("¡Éxito con POST XML! URL que funcionó: $url");
                break;
            }
        }
    }
    
    // Método 4: Si XML no funcionó, probar con JSON
    if ($httpCode != 200 && $httpCode != 201) {
        foreach ($urls405 as $url) {
            error_log("Probando URL (POST con JSON): $url");
            
            $data = json_encode([
                'docPath' => $rutaDocumento,
                'content' => $contenidoBase64
            ]);
            
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_USERPWD, 'okmAdmin:admin');
            curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
            curl_setopt($ch, CURLOPT_HTTPHEADER, [
                'Content-Type: application/json; charset=UTF-8',
                'Accept: application/json'
            ]);
            curl_setopt($ch, CURLOPT_TIMEOUT, 120);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
            
            $response = curl_exec($ch);
            $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            $error = curl_error($ch);
            curl_close($ch);
            
            error_log("Respuesta ($url - POST JSON): HTTP $httpCode");
            error_log("Respuesta completa: " . substr($response, 0, 500));
            
            if ($httpCode == 200 || $httpCode == 201) {
                $urlExitoso = $url;
                error_log("¡Éxito con POST JSON! URL que funcionó: $url");
                break;
            }
        }
    }
    
    // Método 5: Si JSON no funcionó, probar con multipart/form-data
    if ($httpCode != 200 && $httpCode != 201) {
        foreach ($urls405 as $url) {
            error_log("Probando URL (POST con multipart/form-data): $url");
            
            $postData = [
                'docPath' => $rutaDocumento,
                'content' => new CURLFile($archivoTemporal, 'image/jpeg', $nombreArchivo)
            ];
            
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_USERPWD, 'okmAdmin:admin');
            curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
            // NO establecer Content-Type manualmente, cURL lo hace automáticamente para multipart/form-data
            curl_setopt($ch, CURLOPT_TIMEOUT, 120);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
            
            $response = curl_exec($ch);
            $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            $error = curl_error($ch);
            curl_close($ch);
            
            error_log("Respuesta ($url - POST multipart): HTTP $httpCode");
            error_log("Respuesta completa: " . substr($response, 0, 500));
            
            if ($httpCode == 200 || $httpCode == 201) {
                $urlExitoso = $url;
                error_log("¡Éxito con POST multipart! URL que funcionó: $url");
                break;
            }
        }
    }
    
    // Si aún no funciona, intentar con application/x-www-form-urlencoded en POST
    if ($httpCode != 200 && $httpCode != 201) {
        foreach ($urls405 as $url) {
            error_log("Probando URL (POST con application/x-www-form-urlencoded): $url");
            
            $postFields = 'docPath=' . urlencode($rutaDocumento) . '&content=' . urlencode($contenidoBase64);
            
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_USERPWD, 'okmAdmin:admin');
            curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
            curl_setopt($ch, CURLOPT_HTTPHEADER, [
                'Content-Type: application/x-www-form-urlencoded; charset=UTF-8'
            ]);
            curl_setopt($ch, CURLOPT_TIMEOUT, 120);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
            
            $response = curl_exec($ch);
            $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            $error = curl_error($ch);
            curl_close($ch);
            
            error_log("Respuesta ($url - POST form-urlencoded): HTTP $httpCode");
            error_log("Respuesta completa: " . substr($response, 0, 500));
            
            if ($httpCode == 200 || $httpCode == 201) {
                $urlExitoso = $url;
                error_log("¡Éxito con POST form-urlencoded! URL que funcionó: $url");
                break;
            }
            
            // Si da 405, significa que el método no está permitido, probar siguiente URL
            if ($httpCode == 405) {
                error_log("HTTP 405 (Method Not Allowed) en $url, probando siguiente método...");
                continue;
            }
        }
    }
    
    // Verificar si alguno de los métodos funcionó
    if ($httpCode != 200 && $httpCode != 201) {
        // Si el error es PathNotFoundException, intentar crear la carpeta y reintentar
        if (strpos($response, 'PathNotFoundException') !== false) {
            error_log("PathNotFoundException detectado, creando carpeta y reintentando...");
            
            // Crear la carpeta base si no existe
            $rutaCarpetaBase = '/okm:root/Carpeta';
            if (!verificarCarpetaOpenKM($rutaCarpetaBase)) {
                crearCarpetaOpenKM($rutaCarpetaBase);
            }
            
            // Crear la carpeta del trabajador
            $nombreCarpeta = basename($rutaCarpeta);
            $rutaCarpetaCompleta = $rutaCarpetaBase . '/' . $nombreCarpeta;
            crearCarpetaOpenKM($rutaCarpetaCompleta);
            
            // Reintentar subir el documento
            error_log("Reintentando subir documento después de crear carpeta...");
            
            // Reintentar con XML (método más confiable)
            $url = 'https://srvdgx3.midatech.cl/OpenKM/services/rest/document/create';
            $xml = '<?xml version="1.0" encoding="UTF-8"?>' . "\n";
            $xml .= '<document>' . "\n";
            $xml .= '  <docPath>' . htmlspecialchars($rutaDocumento, ENT_XML1, 'UTF-8') . '</docPath>' . "\n";
            $xml .= '  <content>' . $contenidoBase64 . '</content>' . "\n";
            $xml .= '</document>';
            
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_USERPWD, 'okmAdmin:admin');
            curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
            curl_setopt($ch, CURLOPT_HTTPHEADER, [
                'Content-Type: application/xml; charset=UTF-8',
                'Accept: application/xml'
            ]);
            curl_setopt($ch, CURLOPT_TIMEOUT, 120);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
            
            $response = curl_exec($ch);
            $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            $error = curl_error($ch);
            curl_close($ch);
            
            error_log("Respuesta OpenKM (reintento XML): HTTP $httpCode");
            error_log("Respuesta completa: " . substr($response, 0, 1000));
        }
        
        // Si aún falla después del reintento, lanzar error
        if ($httpCode != 200 && $httpCode != 201) {
            $errorDetalle = "No se pudo subir el archivo a OpenKM. HTTP Code: $httpCode";
            if ($error) {
                $errorDetalle .= " - cURL Error: $error";
            }
            if ($response) {
                $errorDetalle .= " - Respuesta: " . substr($response, 0, 500);
            }
            error_log("Error al subir archivo a OpenKM: $errorDetalle");
            throw new Exception("Error al subir a OpenKM: $errorDetalle");
        }
    }
    
    error_log("Archivo subido exitosamente a OpenKM, disponible en: srvdgx3.midatech.cl/uploadgx/Carpeta/$nombreCarpeta/$nombreArchivo");
    
    // Construir la ruta pública (URL) - ya está subido a srvdgx3.midatech.cl
    $rutaPublica = 'https://srvdgx3.midatech.cl/uploadgx/Carpeta/' . $nombreCarpeta . '/' . $nombreArchivo;
    
    return [
        'success' => true,
        'ruta' => $rutaPublica,
        'rutaOpenKM' => $rutaCarpeta . '/' . $nombreArchivo,
        'mensaje' => 'Documento subido correctamente a srvdgx3.midatech.cl'
    ];
}

/**
 * Función para formatear el nombre de carpeta según el formato requerido
 * Formato: RUT sin puntos + guión + apellido con guiones bajos
 * Ejemplo: "17.969.616-9" + "DE PRUEBA" → "17969616-9-DE_PRUEBA"
 */
function formatearNombreCarpeta($rut, $apellidoPaterno) {
    // Eliminar puntos del RUT
    $rutSinPuntos = str_replace('.', '', $rut);
    
    // Convertir apellido a mayúsculas y reemplazar espacios con guiones bajos
    $apellidoFormateado = strtoupper($apellidoPaterno);
    $apellidoFormateado = str_replace(' ', '_', $apellidoFormateado);
    
    // Formato final: RUT-guion-APELLIDO
    return $rutSinPuntos . '-' . $apellidoFormateado;
}

/**
 * Función principal para procesar la subida de documentos a OpenKM
 */
function procesarSubidaOpenKM($rut, $apellidoPaterno, $tipoDocumento, $archivoTemporal, $nombreArchivo) {
    error_log("Iniciando procesamiento de subida a OpenKM");
    error_log("RUT: $rut, Apellido: $apellidoPaterno, Tipo: $tipoDocumento");
    
    try {
        // Formatear el nombre de la carpeta según el formato requerido
        $nombreCarpeta = formatearNombreCarpeta($rut, $apellidoPaterno);
        error_log("Nombre de carpeta formateado: $nombreCarpeta");
        
        // Construir la ruta de la carpeta en OpenKM
        // NO verificar ni crear carpetas - la carpeta ya existe en srvdgx3.midatech.cl/uploadgx/Carpeta/
        $rutaCarpetaBase = '/okm:root/Carpeta';
        $rutaCarpeta = $rutaCarpetaBase . '/' . $nombreCarpeta;
        
        error_log("Ruta carpeta en OpenKM: $rutaCarpeta");
        error_log("La carpeta ya existe en srvdgx3.midatech.cl/uploadgx/Carpeta/$nombreCarpeta/, no se verifica ni crea");
        
        // También formatear el nombre del archivo con el mismo formato
        $rut_sin_puntos = str_replace('.', '', $rut);
        $apellido_formateado = str_replace(' ', '_', strtoupper($apellidoPaterno));
        $nombreArchivoFormateado = $rut_sin_puntos . '-' . $apellido_formateado . '_' . $tipoDocumento . '.jpg';
        
        error_log("Nombre de archivo formateado: $nombreArchivoFormateado");
        
        // Subir el documento a OpenKM
        $resultado = subirDocumentoOpenKM($rutaCarpeta, $nombreArchivoFormateado, $archivoTemporal);
        
        error_log("Documento subido exitosamente a OpenKM: " . $resultado['ruta']);
        return $resultado;
        
    } catch (Exception $e) {
        error_log("Error en procesarSubidaOpenKM: " . $e->getMessage());
        return [
            'success' => false,
            'mensaje' => $e->getMessage()
        ];
    }
}