<?php
// Desactivar display_errors para evitar que se muestren errores antes del JSON
error_reporting(E_ALL);
ini_set('display_errors', 0);
ini_set('log_errors', 1);

// Iniciar buffer de salida para capturar cualquier error
ob_start();

// Registrar manejador de errores para capturar errores fatales
register_shutdown_function(function() {
    $error = error_get_last();
    if ($error !== NULL && in_array($error['type'], [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR])) {
        ob_end_clean();
        header('Content-Type: application/json');
        echo json_encode([
            'success' => false, 
            'message' => 'Error interno del servidor. Por favor, intente nuevamente.'
        ]);
        exit;
    }
});

session_start();

// Incluir configuración centralizada
$configPath = __DIR__ . '/../config/email-config.php';
if (!file_exists($configPath)) {
    ob_end_clean();
    header('Content-Type: application/json');
        echo json_encode(['success' => false, 'message' => 'Error: Archivo de configuración no encontrado'], JSON_UNESCAPED_UNICODE);
    exit;
}

require_once $configPath;

// Limpiar buffer y establecer header JSON
ob_end_clean();
header('Content-Type: application/json; charset=utf-8');

try {
    $pdo = getEmailDatabaseConnection();
} catch(Exception $e) {
    echo json_encode(['success' => false, 'message' => 'Error de conexión a la base de datos: ' . $e->getMessage()], JSON_UNESCAPED_UNICODE);
    exit;
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    try {
        $email = trim($_POST['email'] ?? '');
        
        if (empty($email)) {
            echo json_encode(['success' => false, 'message' => 'El correo electrónico es requerido'], JSON_UNESCAPED_UNICODE);
            exit;
        }
        
        if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            echo json_encode(['success' => false, 'message' => 'El formato del correo electrónico no es válido'], JSON_UNESCAPED_UNICODE);
            exit;
        }
        // Verificar si el email existe en la tabla templeado
        $stmt = $pdo->prepare("SELECT codempleado, nombres, apellidoPaterno, apellidoMaterno FROM templeado WHERE email = ?");
        $stmt->execute([$email]);
        $empleado = $stmt->fetch(PDO::FETCH_ASSOC);
        
        if (!$empleado) {
            echo json_encode(['success' => false, 'message' => 'No se encontró una cuenta asociada a este correo electrónico'], JSON_UNESCAPED_UNICODE);
            exit;
        }
        
        // Generar token único para recuperación
        $token = bin2hex(random_bytes(32));
        $expires = date('Y-m-d H:i:s', strtotime('+1 hour')); // Token válido por 1 hora
        
        // Crear tabla de tokens de recuperación si no existe
        try {
            $createTable = "
                CREATE TABLE IF NOT EXISTS password_reset_tokens (
                    id INT AUTO_INCREMENT PRIMARY KEY,
                    codempleado INT NOT NULL,
                    token VARCHAR(64) NOT NULL,
                    expires_at DATETIME NOT NULL,
                    used TINYINT(1) DEFAULT 0,
                    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                    INDEX idx_codempleado (codempleado),
                    INDEX idx_token (token),
                    INDEX idx_expires_at (expires_at)
                ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
            ";
            $pdo->exec($createTable);
            
            // Verificar si la foreign key ya existe antes de intentar crearla
            $fkExists = false;
            try {
                $stmt = $pdo->query("
                    SELECT COUNT(*) 
                    FROM information_schema.TABLE_CONSTRAINTS 
                    WHERE CONSTRAINT_SCHEMA = DATABASE()
                    AND TABLE_NAME = 'password_reset_tokens'
                    AND CONSTRAINT_NAME = 'fk_password_reset_empleado'
                    AND CONSTRAINT_TYPE = 'FOREIGN KEY'
                ");
                $fkExists = $stmt->fetchColumn() > 0;
            } catch (PDOException $checkError) {
                // Si no puede verificar, intentar crear de todas formas
                $fkExists = false;
            }
            
            // Solo agregar foreign key si no existe
            if (!$fkExists) {
                try {
                    $pdo->exec("ALTER TABLE password_reset_tokens 
                               ADD CONSTRAINT fk_password_reset_empleado 
                               FOREIGN KEY (codempleado) REFERENCES templeado(codempleado) ON DELETE CASCADE");
                } catch (PDOException $fkError) {
                    // Ignorar errores específicos de foreign key duplicada
                    $errorMsg = $fkError->getMessage();
                    $ignoreErrors = [
                        'Duplicate foreign key',
                        'already exists',
                        'Duplicate key',
                        'errno: 121',
                        '1005'
                    ];
                    
                    $shouldIgnore = false;
                    foreach ($ignoreErrors as $ignorePattern) {
                        if (stripos($errorMsg, $ignorePattern) !== false) {
                            $shouldIgnore = true;
                            break;
                        }
                    }
                    
                    if (!$shouldIgnore) {
                        // Solo relanzar si es un error diferente
                        error_log("Error agregando foreign key: " . $errorMsg);
                        // No lanzar excepción, continuar sin la foreign key
                    }
                }
            }
        } catch (PDOException $e) {
            // Verificar si el error es sobre foreign key duplicada
            $errorMsg = $e->getMessage();
            if (stripos($errorMsg, 'errno: 121') !== false || 
                stripos($errorMsg, 'Duplicate key') !== false ||
                stripos($errorMsg, '1005') !== false) {
                // Es un error de foreign key duplicada, ignorar y continuar
                error_log("Advertencia: Foreign key ya existe, continuando sin error: " . $errorMsg);
            } else {
                // Es otro tipo de error, lanzar excepción
                error_log("Error creando tabla password_reset_tokens: " . $errorMsg);
                throw new Exception("Error al crear tabla de tokens: " . $errorMsg);
            }
        }
        
        // Eliminar tokens anteriores no utilizados para este empleado
        $stmt = $pdo->prepare("DELETE FROM password_reset_tokens WHERE codempleado = ? AND (used = 1 OR expires_at < NOW())");
        $stmt->execute([$empleado['codempleado']]);
        
        // Insertar nuevo token
        $stmt = $pdo->prepare("INSERT INTO password_reset_tokens (codempleado, token, expires_at) VALUES (?, ?, ?)");
        $stmt->execute([$empleado['codempleado'], $token, $expires]);
        
        // Preparar datos para el email
        $nombreCompleto = trim(
            ($empleado['nombres'] ?? '') . ' ' . 
            ($empleado['apellidoPaterno'] ?? '') . ' ' . 
            ($empleado['apellidoMaterno'] ?? '')
        );
        if (empty($nombreCompleto)) {
            $nombreCompleto = 'Usuario';
        }
        
        // Construir URL base
        $protocol = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on') ? "https" : "http";
        $host = $_SERVER['HTTP_HOST'];
        $scriptPath = dirname($_SERVER['SCRIPT_NAME']);
        $basePath = str_replace('/actions', '', $scriptPath);
        $resetLink = $protocol . "://" . $host . $basePath . "/reset-password.php?token=" . $token;
        
        // Obtener configuración
        try {
            $config = getEmailConfig();
            if (!$config || !is_array($config)) {
                throw new Exception("Error al obtener configuración de email");
            }
        } catch (Exception $configError) {
            error_log("Error obteniendo configuración: " . $configError->getMessage());
            $config = null; // Usar valores por defecto
        }
        
        // Enviar email
        $emailSent = sendRecoveryEmail($email, $nombreCompleto, $resetLink, $config);
        
        // Determinar si estamos en modo desarrollo
        // Priorizar la configuración del archivo sobre la detección automática
        $isDevelopment = false;
        if ($config && isset($config['development_mode'])) {
            $isDevelopment = (bool)$config['development_mode'];
        } elseif ($_SERVER['HTTP_HOST'] === 'localhost' || 
                  $_SERVER['HTTP_HOST'] === '127.0.0.1' || 
                  strpos($_SERVER['HTTP_HOST'], '.local') !== false) {
            // Solo detectar automáticamente como desarrollo en localhost
            $isDevelopment = true;
        }
        
        // SIEMPRE guardar el link en un archivo de log (como respaldo)
        // Esto es importante porque mail() puede fallar en algunos hostings
        $logFileName = ($config && isset($config['log_file'])) ? basename($config['log_file']) : 'password_reset_links.log';
        $logFile = __DIR__ . '/' . $logFileName;
        $logMessage = date('Y-m-d H:i:s') . " - Email: $email, Link: $resetLink, Token: $token\n";
        $logSaved = @file_put_contents($logFile, $logMessage, FILE_APPEND | LOCK_EX);
        
        // Verificar si la función mail() está disponible
        $mailFunctionAvailable = function_exists('mail');
        
        // Si el email se envió exitosamente (vía SMTP o mail()), mostrar mensaje de éxito
        if ($emailSent) {
            // Email enviado exitosamente (vía SMTP o mail())
            $message = '✅ <strong>¡Correo enviado exitosamente!</strong><br><br>';
            $message .= '📧 Se ha enviado un enlace de recuperación a su correo electrónico.<br>';
            $message .= 'Por favor, revise su bandeja de entrada (y la carpeta de spam si no lo encuentra).<br><br>';
            $message .= '⏰ <small class="text-muted">El enlace es válido por 1 hora desde su generación.</small>';
            
            // En desarrollo, mencionar el log también
            if ($isDevelopment) {
                $message .= '<br><br>ℹ️ <small>El enlace también se ha guardado en ' . $logFileName . '</small>';
            }
            
            echo json_encode([
                'success' => true, 
                'message' => $message
            ], JSON_UNESCAPED_UNICODE);
        } else {
            // Verificar si el error fue específicamente de SMTP
            $smtpErrorDetected = false;
            $smtpErrorDetail = '';
            
            // Leer los últimos logs para detectar errores SMTP
            $logFile = __DIR__ . '/../error.log';
            if (file_exists($logFile)) {
                $logContent = @file_get_contents($logFile);
                if ($logContent && (stripos($logContent, 'SMTP') !== false || 
                    stripos($logContent, 'autenticación') !== false ||
                    stripos($logContent, 'authentication') !== false ||
                    stripos($logContent, '535') !== false)) {
                    $smtpErrorDetected = true;
                }
            }
            // Si mail() falló o no está disponible, pero el token se guardó correctamente
            // Consideramos esto como éxito porque el usuario puede usar el link del log
            // o el administrador puede enviarlo manualmente
            
            if (!$mailFunctionAvailable) {
                // mail() no está disponible - guardar en log y notificar
                error_log("FUNCIÓN MAIL() NO DISPONIBLE en el servidor. Link guardado en: $logFile");
                
                // En producción sin mail(), siempre considerar éxito porque el link está guardado
                // El administrador puede acceder a ver-reset-links.php para obtenerlo
                
                // En desarrollo, mostrar el link directamente
                if ($isDevelopment) {
                    $message = 'Enlace de recuperación generado (mail() no disponible). ';
                    $message .= 'Link: ' . $resetLink;
                    
                    echo json_encode([
                        'success' => true, 
                        'message' => $message,
                        'reset_link' => $resetLink
                    ], JSON_UNESCAPED_UNICODE);
                } else {
                    // En producción, mensaje profesional sin mostrar el enlace
                    $referenceCode = substr($token, 0, 8);
                    $message = '✅ Solicitud de recuperación generada exitosamente.<br><br>';
                    $message .= '📧 <strong>Estado:</strong> El envío automático de correo no está disponible en este momento.<br><br>';
                    $message .= '🔑 <strong>Código de referencia:</strong> <code style="background: #f0f0f0; padding: 4px 8px; border-radius: 4px; font-weight: bold;">' . $referenceCode . '</code><br><br>';
                    $message .= '👤 <strong>Próximos pasos:</strong><br>';
                    $message .= '1. Contacte al administrador del sistema<br>';
                    $message .= '2. Proporcione su correo electrónico y el código de referencia<br>';
                    $message .= '3. El administrador le proporcionará el enlace de recuperación<br><br>';
                    $message .= '⏰ <small class="text-muted">El enlace es válido por 1 hora desde su generación.</small>';
                    
                    echo json_encode([
                        'success' => true, 
                        'message' => $message,
                        'reference_code' => $referenceCode,
                        'contact_admin' => true,
                        'info' => 'El enlace ha sido guardado de forma segura. El administrador puede acceder a él desde el panel de administración.'
                    ], JSON_UNESCAPED_UNICODE);
                }
            } else {
                // mail() falló pero está disponible o SMTP falló
                $referenceCode = substr($token, 0, 8);
                error_log("Error al enviar email a $email. Link guardado en: $logFile");
                
                // Si se detectó un error de SMTP, mostrar mensaje más específico
                if ($smtpErrorDetected && $useSMTP) {
                    $message = '❌ <strong>Error de configuración SMTP</strong><br><br>';
                    $message .= '📧 No se pudo enviar el correo automáticamente debido a un error en la configuración SMTP.<br><br>';
                    $message .= '🔧 <strong>Posibles causas:</strong><br>';
                    $message .= '• Credenciales SMTP incorrectas (usuario o contraseña)<br>';
                    $message .= '• Servidor SMTP no accesible<br>';
                    $message .= '• Puerto o encriptación incorrectos<br><br>';
                    $message .= '🔑 <strong>Código de referencia:</strong> <code style="background: #f0f0f0; padding: 4px 8px; border-radius: 4px; font-weight: bold;">' . $referenceCode . '</code><br><br>';
                    $message .= '👤 <strong>Próximos pasos:</strong><br>';
                    $message .= '1. Contacte al administrador del sistema<br>';
                    $message .= '2. Proporcione su correo electrónico y el código de referencia<br>';
                    $message .= '3. El administrador puede verificar la configuración SMTP en <code>config/email-config.php</code><br>';
                    $message .= '4. También puede probar la configuración SMTP usando <code>test-smtp.php</code><br><br>';
                    $message .= '⏰ <small class="text-muted">El enlace de recuperación ha sido guardado de forma segura y es válido por 1 hora.</small>';
                } else {
                    $message = 'No se pudo enviar el correo automáticamente, pero se ha generado el enlace de recuperación. ';
                    $message .= 'Por favor, contacte al administrador del sistema.';
                    $message .= ' (Código de referencia: ' . $referenceCode . ')';
                }
                
                // En desarrollo, mostrar el link
                if ($isDevelopment) {
                    $message = 'Enlace de recuperación generado. ';
                    $message .= 'Verifique el archivo ' . $logFileName . ' para obtener el enlace completo.';
                    $message .= ' Link: ' . $resetLink;
                    
                    echo json_encode([
                        'success' => true, 
                        'message' => $message,
                        'reset_link' => $resetLink
                    ], JSON_UNESCAPED_UNICODE);
                } else {
                    // En producción, informar pero no mostrar el link completo por seguridad
                    echo json_encode([
                        'success' => false, 
                        'message' => $message,
                        'contact_admin' => true,
                        'reference_code' => $referenceCode
                    ], JSON_UNESCAPED_UNICODE);
                }
            }
        }
        
    } catch (Exception $e) {
        $errorMessage = $e->getMessage();
        $errorTrace = $e->getTraceAsString();
        error_log("Error en forgot-password.php: " . $errorMessage);
        error_log("Trace: " . $errorTrace);
        
        // En modo desarrollo, mostrar más detalles del error
        $config = null;
        try {
            $config = getEmailConfig();
        } catch (Exception $configError) {
            // Ignorar error de configuración
        }
        
        $isDevelopment = ($config && isset($config['development_mode']) && $config['development_mode']) || 
                         ($_SERVER['HTTP_HOST'] === 'localhost' || $_SERVER['HTTP_HOST'] === '127.0.0.1');
        
        if ($isDevelopment) {
            echo json_encode([
                'success' => false, 
                'message' => 'Error interno del servidor: ' . $errorMessage,
                'trace' => $errorTrace
            ], JSON_UNESCAPED_UNICODE);
        } else {
            echo json_encode(['success' => false, 'message' => 'Error interno del servidor. Por favor, intente nuevamente.'], JSON_UNESCAPED_UNICODE);
        }
    }
} else {
    echo json_encode(['success' => false, 'message' => 'Método no permitido'], JSON_UNESCAPED_UNICODE);
}

/**
 * Enviar email de recuperación usando SMTP
 */
function sendRecoveryEmailSMTP($email, $nombre, $resetLink, $subject, $smtpConfig, $config = null) {
    try {
        // Incluir la clase SMTPMailer
        $smtpPath = __DIR__ . '/../config/smtp-mailer.php';
        if (!file_exists($smtpPath)) {
            error_log("Archivo smtp-mailer.php no encontrado");
            return false;
        }
        
        require_once $smtpPath;
        
        // Crear instancia de SMTPMailer
        $mailer = new SMTPMailer(
            $smtpConfig['smtp_host'],
            $smtpConfig['smtp_port'],
            $smtpConfig['smtp_username'],
            $smtpConfig['smtp_password'],
            $smtpConfig['smtp_encryption']
        );
        
        // Obtener configuración del remitente
        $fromEmail = $smtpConfig['smtp_username'];
        $fromName = 'SIGVEM Sistema';
        if ($config && isset($config['sender'])) {
            $fromEmail = $config['sender']['from_email'];
            $fromName = $config['sender']['from_name'];
        }
        
        // Preparar mensajes
        $textMessage = "SIGVEM - Sistema de Gestión\n";
        $textMessage .= "Recuperación de Contraseña\n\n";
        $textMessage .= "Hola " . $nombre . ",\n\n";
        $textMessage .= "Hemos recibido una solicitud para restablecer la contraseña de su cuenta en SIGVEM.\n\n";
        $textMessage .= "Para crear una nueva contraseña, visite el siguiente enlace:\n";
        $textMessage .= $resetLink . "\n\n";
        $textMessage .= "IMPORTANTE:\n";
        $textMessage .= "- Este enlace es válido por 1 hora\n";
        $textMessage .= "- Solo puede ser utilizado una vez\n";
        $textMessage .= "- Si no solicitó este cambio, ignore este correo\n\n";
        $textMessage .= "Este es un correo automático, por favor no responda.";
        
        $htmlMessage = "
        <!DOCTYPE html>
        <html>
        <head>
            <meta charset='UTF-8'>
            <style>
                body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; }
                .container { max-width: 600px; margin: 0 auto; padding: 20px; }
                .header { background: linear-gradient(135deg, #6db6e7 0%, #bf7d9f 100%); color: white; padding: 20px; text-align: center; border-radius: 10px 10px 0 0; }
                .content { background: #f8f9fa; padding: 30px; border-radius: 0 0 10px 10px; }
                .btn { display: inline-block; padding: 12px 25px; background: #0d6efd; color: white; text-decoration: none; border-radius: 5px; margin: 20px 0; }
                .warning { background: #fff3cd; border: 1px solid #ffeaa7; padding: 15px; border-radius: 5px; margin: 20px 0; }
            </style>
        </head>
        <body>
            <div class='container'>
                <div class='header'>
                    <h2>SIGVEM - Sistema de Gestión</h2>
                    <p>Recuperación de Contraseña</p>
                </div>
                <div class='content'>
                    <h3>Hola " . htmlspecialchars($nombre) . ",</h3>
                    <p>Hemos recibido una solicitud para restablecer la contraseña de su cuenta en SIGVEM.</p>
                    <p>Para crear una nueva contraseña, haga clic en el siguiente enlace:</p>
                    <p style='text-align: center;'>
                        <a href='" . $resetLink . "' class='btn'>Restablecer Contraseña</a>
                    </p>
                    <div class='warning'>
                        <strong>Importante:</strong>
                        <ul>
                            <li>Este enlace es válido por 1 hora</li>
                            <li>Solo puede ser utilizado una vez</li>
                            <li>Si no solicitó este cambio, ignore este correo</li>
                        </ul>
                    </div>
                    <p>Si el botón no funciona, copie y pegue este enlace en su navegador:</p>
                    <p style='word-break: break-all; background: #e9ecef; padding: 10px; border-radius: 5px;'>
                        " . $resetLink . "
                    </p>
                    <hr>
                    <p><small>Este es un correo automático, por favor no responda.</small></p>
                </div>
            </div>
        </body>
        </html>";
        
        // Enviar email
        $result = $mailer->send($email, $subject, $textMessage, $fromEmail, $fromName, $htmlMessage);
        
        if ($result) {
            error_log("Email enviado exitosamente vía SMTP a: $email");
        } else {
            $errorDetail = $mailer->getLastError();
            error_log("Error al enviar email vía SMTP a: $email");
            if (!empty($errorDetail)) {
                error_log("Detalle del error SMTP: " . $errorDetail);
            }
        }
        
        return $result;
        
    } catch (Exception $e) {
        $errorMsg = "Excepción en sendRecoveryEmailSMTP: " . $e->getMessage();
        error_log($errorMsg);
        error_log("Trace: " . $e->getTraceAsString());
        return false;
    }
}

function sendRecoveryEmail($email, $nombre, $resetLink, $config = null) {
    try {
        $subject = "Recuperación de Contraseña - SIGVEM";
        
        // Verificar si se debe usar SMTP
        $useSMTP = false;
        $smtpConfig = null;
        
        if ($config && isset($config['smtp'])) {
            $smtpConfig = $config['smtp'];
            $useSMTP = isset($smtpConfig['use_smtp']) && $smtpConfig['use_smtp'] && 
                      !empty($smtpConfig['smtp_host']) && 
                      !empty($smtpConfig['smtp_username']) && 
                      !empty($smtpConfig['smtp_password']);
        }
        
        // Si SMTP está configurado, intentar usarlo primero
        if ($useSMTP) {
            try {
                $smtpResult = sendRecoveryEmailSMTP($email, $nombre, $resetLink, $subject, $smtpConfig, $config);
                if ($smtpResult) {
                    return true; // SMTP funcionó
                }
                // Si SMTP falla, continuar con mail() como respaldo
                error_log("SMTP falló, intentando con mail() nativa como respaldo");
            } catch (Exception $smtpException) {
                error_log("Excepción en SMTP: " . $smtpException->getMessage());
                // Continuar con mail() como respaldo
            }
        }
        
        // Usar mail() nativa (funciona mejor en hostings compartidos)
        if (!function_exists('mail')) {
            error_log("La función mail() no está disponible");
            return false;
        }
        
        // Versión HTML del mensaje
        $htmlMessage = "
        <!DOCTYPE html>
        <html>
        <head>
            <meta charset='UTF-8'>
            <style>
                body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; }
                .container { max-width: 600px; margin: 0 auto; padding: 20px; }
                .header { background: linear-gradient(135deg, #6db6e7 0%, #bf7d9f 100%); color: white; padding: 20px; text-align: center; border-radius: 10px 10px 0 0; }
                .content { background: #f8f9fa; padding: 30px; border-radius: 0 0 10px 10px; }
                .btn { display: inline-block; padding: 12px 25px; background: #0d6efd; color: white; text-decoration: none; border-radius: 5px; margin: 20px 0; }
                .warning { background: #fff3cd; border: 1px solid #ffeaa7; padding: 15px; border-radius: 5px; margin: 20px 0; }
            </style>
        </head>
        <body>
            <div class='container'>
                <div class='header'>
                    <h2>SIGVEM - Sistema de Gestión</h2>
                    <p>Recuperación de Contraseña</p>
                </div>
                <div class='content'>
                    <h3>Hola " . htmlspecialchars($nombre) . ",</h3>
                    <p>Hemos recibido una solicitud para restablecer la contraseña de su cuenta en SIGVEM.</p>
                    <p>Para crear una nueva contraseña, haga clic en el siguiente enlace:</p>
                    <p style='text-align: center;'>
                        <a href='" . $resetLink . "' class='btn'>Restablecer Contraseña</a>
                    </p>
                    <div class='warning'>
                        <strong>Importante:</strong>
                        <ul>
                            <li>Este enlace es válido por 1 hora</li>
                            <li>Solo puede ser utilizado una vez</li>
                            <li>Si no solicitó este cambio, ignore este correo</li>
                        </ul>
                    </div>
                    <p>Si el botón no funciona, copie y pegue este enlace en su navegador:</p>
                    <p style='word-break: break-all; background: #e9ecef; padding: 10px; border-radius: 5px;'>
                        " . $resetLink . "
                    </p>
                    <hr>
                    <p><small>Este es un correo automático, por favor no responda.</small></p>
                </div>
            </div>
        </body>
        </html>";
        
        // Versión texto plano del mensaje
        $textMessage = "SIGVEM - Sistema de Gestión\n";
        $textMessage .= "Recuperación de Contraseña\n\n";
        $textMessage .= "Hola " . $nombre . ",\n\n";
        $textMessage .= "Hemos recibido una solicitud para restablecer la contraseña de su cuenta en SIGVEM.\n\n";
        $textMessage .= "Para crear una nueva contraseña, visite el siguiente enlace:\n";
        $textMessage .= $resetLink . "\n\n";
        $textMessage .= "IMPORTANTE:\n";
        $textMessage .= "- Este enlace es válido por 1 hora\n";
        $textMessage .= "- Solo puede ser utilizado una vez\n";
        $textMessage .= "- Si no solicitó este cambio, ignore este correo\n\n";
        $textMessage .= "Este es un correo automático, por favor no responda.";
        
        // Crear mensaje multipart
        $boundary = md5(uniqid(time()));
        
        $fullMessage = "--$boundary\r\n";
        $fullMessage .= "Content-Type: text/plain; charset=UTF-8\r\n";
        $fullMessage .= "Content-Transfer-Encoding: 8bit\r\n\r\n";
        $fullMessage .= $textMessage . "\r\n\r\n";
        
        $fullMessage .= "--$boundary\r\n";
        $fullMessage .= "Content-Type: text/html; charset=UTF-8\r\n";
        $fullMessage .= "Content-Transfer-Encoding: 8bit\r\n\r\n";
        $fullMessage .= $htmlMessage . "\r\n\r\n";
        $fullMessage .= "--$boundary--";
        
        // Usar configuración centralizada si está disponible
        $fromEmail = 'noreply@localhost';
        $fromName = 'SIGVEM Sistema';
        $replyTo = 'noreply@localhost';
        
        if ($config && isset($config['sender'])) {
            $fromEmail = $config['sender']['from_email'];
            $fromName = $config['sender']['from_name'];
            $replyTo = $config['sender']['reply_to'];
        }
        
        $headers = [
            'MIME-Version: 1.0',
            'Content-Type: multipart/alternative; boundary=' . $boundary,
            'From: ' . $fromName . ' <' . $fromEmail . '>',
            'Reply-To: ' . $replyTo,
            'X-Mailer: PHP/' . phpversion(),
            'X-Priority: 3'
        ];
        
        // Intentar enviar el correo
        $result = @mail($email, $subject, $fullMessage, implode("\r\n", $headers));
        
        // Si mail() falla, intentar método alternativo más simple
        if (!$result) {
            error_log("Primer intento de mail() falló. Intentando método alternativo...");
            
            // Método alternativo más simple
            $simpleHeaders = "From: " . $fromName . " <" . $fromEmail . ">\r\n";
            $simpleHeaders .= "Reply-To: " . $replyTo . "\r\n";
            $simpleHeaders .= "Content-Type: text/html; charset=UTF-8\r\n";
            
            $result = @mail($email, $subject, $htmlMessage, $simpleHeaders);
            
            if (!$result) {
                $lastError = error_get_last();
                if ($lastError) {
                    error_log("Error al enviar email: " . $lastError['message']);
                } else {
                    error_log("Error al enviar email: Función mail() retornó false sin error específico");
                }
            }
        }
        
        return $result;
        
    } catch (Exception $e) {
        error_log("Error en sendRecoveryEmail: " . $e->getMessage());
        return false;
    }
}
?>
