<?php
// Incluye el archivo de configuración para acceder a las constantes y funciones necesarias
require_once 'config/config.php';
// Incluye el archivo encargado de decodificar correos
require_once 'decode.php';

// Función para escapar caracteres especiales y prevenir ataques XSS
function escape_string($string) {
    return htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
}

// Función para validar el correo electrónico ingresado
function validate_email($email) {
    // Verifica si el correo está vacío o es inválido
    if (empty($email) || !filter_var($email, FILTER_VALIDATE_EMAIL)) {
        return 'El correo electrónico proporcionado es inválido o está vacío.';
    }
    // Verifica que el correo no exceda los 50 caracteres
    if (strlen($email) > 50) {
        return 'El correo electrónico no debe superar los 50 caracteres.';
    }
    return ''; // Retorna vacío si el correo es válido
}

// Función para verificar si el correo está autorizado
function is_authorized_email($email) {
    // Si la función de autorización está desactivada, permite el correo directamente
    if (!EMAIL_AUTH_ENABLED) {
        return true;
    }
    // Carga la lista de correos autorizados desde un archivo JSON
    $authorized_emails = json_decode(file_get_contents('security/auth/authorized_emails.json'), true);
    // Convierte la lista a un formato de búsqueda más eficiente
    $authorized_email_set = array_flip($authorized_emails);
    // Retorna verdadero si el correo está autorizado
    return isset($authorized_email_set[$email]);
}

// Función para buscar correos en la bandeja de entrada según el destinatario y asunto
function search_email($inbox, $email, $asunto) {
    // Realiza la búsqueda de correos usando imap_search
    $emails = imap_search($inbox, 'TO "' . $email . '" SUBJECT "' . $asunto . '"');
    // Retorna un mensaje de error si ocurre un problema en la búsqueda
    if ($emails === false) {
        return 'Ocurrió un error al buscar correos: ' . imap_last_error();
    }
    return $emails; // Retorna el resultado de la búsqueda
}

// Sanitiza y valida el correo electrónico ingresado por el usuario
$email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);
$asunto = $_POST['asunto']; // Asunto del correo a buscar
$resultado = validate_email($email); // Valida el correo

if ($resultado === '') { // Si no hay errores en la validación
    $email = escape_string($email); // Escapa el correo para prevenir XSS

    // Verifica si el correo está en la lista de correos autorizados
    if (!is_authorized_email($email)) {
        $resultado = 'Correo electrónico inhabilitado para esta consulta.<br>Por favor, contacte al administrador.';
    } else {
        // Busca correos que coincidan con el destinatario y asunto proporcionado
        $emails = search_email($inbox, $email, $asunto);
        
        // Si se encuentran correos que coincidan
        if (is_array($emails) && !empty($emails)) {
            // Obtiene el ID del correo más reciente
            $latest_email_id = max($emails);
            // Obtiene la información del encabezado del correo
            $header = imap_headerinfo($inbox, $latest_email_id);
            // Obtiene y procesa el cuerpo del correo
            $body = get_email_body($inbox, $latest_email_id, $header);
            $body = process_email_body($body); // Asegura que el cuerpo se imprima correctamente
            $body = quoted_printable_decode($body); // Asegura que las secuencias =20 se conviertan en espacio
            $resultado = $body; // Almacena el cuerpo como resultado
        } else {
            // Si no se encontraron correos, almacena el resultado como mensaje de error
            $resultado = '0 mensajes encontrados.';
        }
    }
}

// Almacena el resultado en la sesión y redirige al usuario a la página principal
$_SESSION['resultado'] = $resultado;
header('Location: home.php'); // Redirecciona a la página de inicio
exit();
?>