function configuracionQueryArgs($args, $paged, $user_id, $current_user_id)
{
    global $FALLBACK_USER_ID;
    if (!isset($FALLBACK_USER_ID)) {
        $FALLBACK_USER_ID = 44;
    }

    $is_authenticated = $current_user_id && $current_user_id != 0;
    $is_admin = current_user_can('administrator');
    if (!$is_authenticated) {
        $current_user_id = $FALLBACK_USER_ID;
    }

    $identifier = $_POST['identifier'] ?? '';
    $posts = $args['posts'];
    $similar_to = $args['similar_to'] ?? null;
    $filtroTiempo = (int)get_user_meta($current_user_id, 'filtroTiempo', true);
    $query_args = construirQueryArgs($args, $paged, $current_user_id, $identifier, $is_admin, $posts, $filtroTiempo, $similar_to);
    $query_args = aplicarFiltrosUsuario($query_args, $current_user_id);
    $query_args = aplicarFiltroGlobal($query_args, $args, $current_user_id);
    return $query_args;
}

function construirQueryArgs($args, $paged, $current_user_id, $identifier, $is_admin, $posts, $filtroTiempo, $similar_to)
{
    global $wpdb;
    $query_args = [
        'post_type' => $args['post_type'],
        'posts_per_page' => $posts,
        'paged' => $paged,
        'ignore_sticky_posts' => true,
        'suppress_filters' => false,
    ];

    postLog("Iniciando construirQueryArgs con filtroTiempo: $filtroTiempo");

    // Aplicar filtro de identificador
    if (!empty($identifier)) {
        $query_args = filtrarIdentifier($identifier, $query_args);
    }

    // Aplicar ordenamiento
    if ($args['post_type'] === 'social_post') {
        $query_args = ordenamientoQuery($query_args, $filtroTiempo, $current_user_id, $identifier, $similar_to, $paged, $is_admin, $posts);
    }

    postLog("Query args finales: " . print_r($query_args, true));
    return $query_args;
}

function filtrarIdentifier($identifier, $query_args) {
    global $wpdb;

    // Normalizar el término de búsqueda
    $identifier = strtolower(trim($identifier));
    
    // Remover 's' final si existe (para manejar plurales)
    $terms = explode(' ', $identifier);
    $normalized_terms = array();
    
    foreach ($terms as $term) {
        $term = trim($term);
        if (empty($term)) continue;
        
        // Agregar tanto la versión singular como plural
        $normalized_terms[] = $term;
        if (substr($term, -1) === 's') {
            $normalized_terms[] = substr($term, 0, -1); // Versión singular
        } else {
            $normalized_terms[] = $term . 's'; // Versión plural
        }
    }
    
    $normalized_terms = array_unique($normalized_terms);
    $query_args['s'] = $identifier;

    add_filter('posts_search', function ($search, $wp_query) use ($normalized_terms, $wpdb) {
        if (empty($normalized_terms)) {
            return $search;
        }

        $search = '';
        $search_conditions = array();
        
        // Construir condición OR para cada término y sus variaciones
        $term_conditions = array();
        foreach ($normalized_terms as $term) {
            $like_term = '%' . $wpdb->esc_like($term) . '%';
            $term_conditions[] = $wpdb->prepare("
                {$wpdb->posts}.post_title LIKE %s OR
                {$wpdb->posts}.post_content LIKE %s OR
                EXISTS (
                    SELECT 1 FROM {$wpdb->postmeta}
                    WHERE {$wpdb->postmeta}.post_id = {$wpdb->posts}.ID
                    AND {$wpdb->postmeta}.meta_key = 'datosAlgoritmo'
                    AND {$wpdb->postmeta}.meta_value LIKE %s
                )
            ", $like_term, $like_term, $like_term);
        }
        
        if (!empty($term_conditions)) {
            $search .= ' AND (' . implode(' OR ', $term_conditions) . ')';
        }

        return $search;
    }, 10, 2);

    return $query_args;
}

function ordenamientoQuery($query_args, $filtroTiempo, $current_user_id, $identifier, $similar_to, $paged, $is_admin, $posts)
{
    global $wpdb;
    $likes_table = $wpdb->prefix . 'post_likes';

    switch ($filtroTiempo) {
        case 1: // Posts recientes
            $query_args['orderby'] = 'date';
            $query_args['order'] = 'DESC';
            postLog("Caso 1: Ordenando por fecha reciente");
            break;

        case 2: // Top semanal
        case 3: // Top mensual
            $interval = ($filtroTiempo === 2) ? '1 WEEK' : '1 MONTH';
            postLog("Caso $filtroTiempo: Usando intervalo de $interval");

            $sql = "
                SELECT p.ID, 
                       COUNT(pl.post_id) as like_count 
                FROM {$wpdb->posts} p 
                LEFT JOIN {$likes_table} pl ON p.ID = pl.post_id 
                WHERE p.post_type = 'social_post' 
                AND p.post_status = 'publish'
                AND p.post_date >= DATE_SUB(NOW(), INTERVAL $interval)  
                AND pl.like_date >= DATE_SUB(NOW(), INTERVAL $interval) 
                GROUP BY p.ID
                HAVING like_count > 0
                ORDER BY like_count DESC, p.post_date DESC
            ";

            postLog("SQL Query: " . $sql);
            $posts_with_likes = $wpdb->get_results($sql, ARRAY_A);
            postLog("Resultados encontrados: " . count($posts_with_likes));

            if (!empty($posts_with_likes)) {
                $post_ids = wp_list_pluck($posts_with_likes, 'ID');
                if (!empty($post_ids)) {
                    $query_args['post__in'] = $post_ids;
                    $query_args['orderby'] = 'post__in';
                }
                postLog("IDs de posts para esta página: " . implode(', ', $post_ids));
            } else {
                postLog("No se encontraron posts con likes en el período especificado");
                $query_args['orderby'] = 'date';
                $query_args['order'] = 'DESC';
            }
            break;

        default:
            postLog("Caso default: Obteniendo feed personalizado");
            En el caso default se supone que esto calcula los post mas relavantes para el usuario (lo hace internamente, antes funcionaba pero parece que algo se daño y simplemente regresa los post mas recientes)
            obtenerFeedPersonalizado($current_user_id, $identifier, $similar_to, $paged, $is_admin, $posts);

            break;
    }

    return $query_args;
}


function obtenerFeedPersonalizado($current_user_id, $identifier, $similar_to, $paged, $is_admin, $posts_per_page)
{
    $post_not_in = [];

    if ($similar_to) {
        $post_not_in[] = $similar_to;
        $cache_suffix = "_similar_" . $similar_to;
    } else {
        $cache_suffix = "";
    }

    $transient_key = $current_user_id == 44
        ? "feed_personalizado_anonymous_{$identifier}{$cache_suffix}"
        : "feed_personalizado_user_{$current_user_id}_{$identifier}{$cache_suffix}";
    $use_cache = !$is_admin;
    $cached_data = $use_cache ? get_transient($transient_key) : false;
    if ($cached_data) {
        $posts_personalizados = $cached_data['posts'];
    } else {
        if ($paged === 1) {
            $posts_personalizados = calcularFeedPersonalizado($current_user_id, $identifier, $similar_to);
        } else {
            $posts_personalizados = get_option($transient_key . '_backup', []);
            if (empty($posts_personalizados)) {
                $posts_personalizados = calcularFeedPersonalizado($current_user_id, $identifier, $similar_to);
            }
        }
        if ($use_cache) {
            $cache_data = ['posts' => $posts_personalizados, 'timestamp' => time()];
            $cache_time = $similar_to ? 3600 : 86400;
            set_transient($transient_key, $cache_data, $cache_time);
            update_option($transient_key . '_backup', $posts_personalizados);
        }
    }
    $post_ids = array_keys($posts_personalizados);
    if ($similar_to) {
        $post_ids = array_filter($post_ids, function ($post_id) use ($similar_to) {
            return $post_id != $similar_to;
        });
    }
    $post_ids = array_keys($posts_personalizados);
    if ($similar_to) {
        $post_ids = array_filter($post_ids, function ($post_id) use ($similar_to) {
            return $post_id != $similar_to;
        });
    }
    $post_ids = array_unique($post_ids);
    return [
        'post_ids' => $post_ids,
        'post_not_in' => [],  
    ];
}

function calcularFeedPersonalizado($userId, $identifier = '', $similar_to = null)
{
    // Validar que el userId sea válido
    if (empty($userId) || !is_numeric($userId)) {
        error_log("Usuario ID inválido Feed: " . print_r($userId, true));
        return [];
    }

    $datos = obtenerDatosFeedConCache($userId);
    if (empty($datos)) {
        error_log("Datos vacíos para usuario ID: " . $userId);
        return [];
    }

    // Obtener y validar datos del usuario
    $usuario = get_userdata($userId);
    if (!$usuario || !is_object($usuario)) {
        error_log("No se pudo obtener datos del usuario ID: " . $userId);
        return [];
    }

    // Validar roles del usuario
    $esAdmin = false;
    if (isset($usuario->roles) && is_array($usuario->roles)) {
        $esAdmin = in_array('administrator', $usuario->roles);
    } else {
        $roles = array_map('strtolower', (array) $usuario->roles);
        $esAdmin = in_array('administrator', $roles);
    }

    // Obtener y validar vistas de posts
    $vistas_posts_processed = obtenerYProcesarVistasPosts($userId);
    if ($vistas_posts_processed === false) {
        error_log("Error al procesar vistas de posts para usuario ID: " . $userId);
        return [];
    }

    $posts_personalizados = [];
    $resumenPuntos = [];

    // Validar que author_results sea un array
    if (!isset($datos['author_results']) || !is_array($datos['author_results'])) {
        error_log("author_results no es válido para usuario ID: " . $userId);
        return [];
    }
    $current_timestamp = current_time('timestamp');

    foreach ($datos['author_results'] as $post_id => $post_data) {
        try {
            $puntosFinal = calcularPuntosPost(
                $post_id,
                $post_data,
                $datos,
                $esAdmin,
                $vistas_posts_processed,
                $identifier,
                $similar_to, 
                $current_timestamp,
                $userId
            );

            if (is_numeric($puntosFinal)) {
                $posts_personalizados[$post_id] = $puntosFinal;
                $resumenPuntos[$post_id] = round($puntosFinal, 2);
            }
        } catch (Exception $e) {
            error_log("Error al calcular puntos para post ID {$post_id}: " . $e->getMessage());
            continue;
        }
    }

    if (empty($posts_personalizados)) {
        error_log("No se generaron posts personalizados para usuario ID: " . $userId);
        return [];
    }

    arsort($posts_personalizados);
    arsort($resumenPuntos);

    return $posts_personalizados;
}