<?php

class Search_Bar_Controller_Orphic_UI
{
  // Constante pour la longueur maximale de l'extrait
  const EXCERPT_LENGTH = 120;



  public static function register_routes()
  {
    register_rest_route('orphic-ui/v1', '/search', array(
      'methods' => 'POST',
      'callback' => array(__CLASS__, 'get_search_results'),
      'permission_callback' => '__return_true',
    ));
  }

  // Nouvelle fonction pour optimiser l'extrait
  private static function get_optimized_excerpt($post_excerpt)
  {
    // Si l'extrait est vide, retourner une chaîne vide
    if (empty($post_excerpt)) {
      return '';
    }

    // Nettoyer l'extrait de tout HTML
    $clean_excerpt = wp_strip_all_tags($post_excerpt);

    // Tronquer l'extrait à la longueur souhaitée
    if (mb_strlen($clean_excerpt) > self::EXCERPT_LENGTH) {
      $clean_excerpt = mb_substr($clean_excerpt, 0, self::EXCERPT_LENGTH) . '...';
    }

    return $clean_excerpt;
  }

  private static function get_search_keywords($search_term)
  {
    $args = [
      'post_type'      => 'any',
      'posts_per_page' => 5,
      'meta_query'     => [
        [
          'key'     => 'search_keywords',
          'value'   => $search_term,
          'compare' => 'LIKE',
        ],
      ],
    ];

    $query = new WP_Query($args);
    $results = [];

    if ($query->have_posts()) {
      while ($query->have_posts()) {
        $query->the_post();
        $post_id = get_the_ID();

        $results[] = array(
          'id' => $post_id,
          'title' => get_the_title(),
          'url' => get_permalink(),
          'type' => get_post_type(),
          'excerpt' => self::get_optimized_excerpt(get_the_excerpt()),
          'score' => 100 // Score élevé pour les résultats avec keywords
        );
      }
      wp_reset_postdata();
    }

    return $results;
  }

  public static function get_search_results($request)
  {
    // Récupération des paramètres de la requête
    $params = $request->get_json_params();
    $search_term = sanitize_text_field($params['search_term'] ?? '');
    $search_config = $params['search_config'] ?? array();

    // Si pas de terme de recherche, on retourne une erreur
    if (empty($search_term)) {
      return new WP_Error(
        'no_search_term',
        'No search term provided',
        array('status' => 400)
      );
    }

    // Construction des arguments de la requête avec optimisation
    $query_args = array(
      's' => $search_term,
      'post_status' => 'publish',
      'posts_per_page' => 5,
      'no_found_rows' => true, // Optimisation: désactive le comptage total des résultats
      'update_post_term_cache' => !empty($search_config['taxonomies']), // Cache des termes uniquement si nécessaire
      'update_post_meta_cache' => false, // Désactive le cache des métadonnées si non utilisé
    );

    // Ajout des types de contenu si spécifiés
    if (!empty($search_config['post_types'])) {
      $query_args['post_type'] = $search_config['post_types'];
    }

    // Optimisation de la gestion des taxonomies
    if (!empty($search_config['taxonomies'])) {
      $tax_query = array('relation' => 'OR');

      // Pré-cache des termes pour toutes les taxonomies d'un coup
      $all_taxonomies = array();
      foreach ($search_config['taxonomies'] as $taxonomies) {
        $all_taxonomies = array_merge($all_taxonomies, $taxonomies);
      }

      if (!empty($all_taxonomies)) {
        get_terms(array(
          'taxonomy' => array_unique($all_taxonomies),
          'name__like' => $search_term,
          'hide_empty' => true,
          'fields' => 'all',
        ));
      }

      $query_args['tax_query'] = $tax_query;
    }

    // Exécution de la requête
    $query = new WP_Query($query_args);
    $results = [];

    // Récupérer d'abord les résultats avec search_keywords
    $keyword_results = self::get_search_keywords($search_term);
    $results = array_slice(array_merge($results, $keyword_results), 0, 5);

    // Préparation des résultats de la recherche normale
    if ($query->have_posts()) {
      while ($query->have_posts()) {
        $query->the_post();
        $post_id = get_the_ID();

        // Vérifier si le post n'est pas déjà dans les résultats des keywords
        if (!array_filter($results, function ($item) use ($post_id) {
          return $item['id'] === $post_id;
        })) {
          $post_title = get_the_title();
          $post_content = wp_strip_all_tags(get_the_content());
          $post_excerpt = self::get_optimized_excerpt(get_the_excerpt());
          $score = 0;

          $result = array(
            'id' => $post_id,
            'title' => $post_title,
            'url' => get_permalink(),
            'type' => get_post_type(),
            'excerpt' => $post_excerpt,
            'score' => $score
          );

          $results[] = $result;
        }
      }
    }

    wp_reset_postdata();

    return new WP_REST_Response(array(
      'success' => true,
      'results' => $results,
      'total' => count($results),
    ));
  }
}
