<?php
// +-------------------------------------------------+
// © 2002-2004 PMB Services / www.sigb.net pmb@sigb.net et contributeurs (voir www.sigb.net)
// +-------------------------------------------------+
// $Id: search.class.php,v 1.1.2.2.2.5 2026/04/30 08:05:00 qvarin Exp $

use Pmb\AI\Library\Source\Semantic;
use Pmb\AI\Orm\AISettingsOrm;

if (stristr($_SERVER['REQUEST_URI'], ".class.php")) {
    die("no access");
}

class ai_search_ask
{
    public $id;
    public $n_ligne;
    public $params;

    public const IS_RESPONSIVE = true;

    /**
     * Recherche parente
     *
     * @var search
     */
    public $search;

    /**
     * Source
     *
     * @var Semantic|null
     */
    public $source = null;

    /**
     * Constructeur
     *
     * @param mixed $id
     * @param mixed $n_ligne
     * @param mixed $params
     * @param search $search
     */
    public function __construct($id, $n_ligne, $params, &$search)
    {
        $this->id = $id;
        $this->n_ligne = $n_ligne;
        $this->params = $params;
        $this->search = &$search;
    }

    /**
     * Fonction de récupération des opérateurs disponibles pour ce champ spécial
     * (renvoie un tableau d'opérateurs)
     *
     * @return array Opérateurs disponibles
     */
    public function get_op()
    {
        $operators = array();
        if ($_SESSION["nb_queries"] != 0) {
            $operators["EQ"] = "=";
        }
        return $operators;
    }

    /**
     * Retourne de la valeur de saisie
     *
     * @return string
     */
    protected function get_value()
    {
        $valeur_ = $this->get_field_name();
        global ${$valeur_};

        $value = ${$valeur_} ?? null;
        return is_string($value) ? stripslashes($value) : '';
    }

    /**
     * Retourne le nom du champ
     *
     * @return string
     */
    protected function get_field_name()
    {
        return "field_{$this->n_ligne}_s_{$this->id}";
    }

    /**
     * Fonction de récupération de l'affichage de la saisie du critère
     *
     * @return string Chaine html
     */
    public function get_input_box()
    {
        $template = <<<HTML
        <span class="search_value">
            <input type="text" name="%s" value="%s" class="ext_search_txt">
        </span>
        HTML;

        return sprintf($template, $this->get_field_name(), $this->get_value());
    }

    /**
     * Retourne le champ caché
     *
     * @return string Chaine html
     */
    public function get_hidden_input_box()
    {
        $template = <<<HTML
            <input type="hidden" name="%s" value="%s">
        HTML;

        return sprintf($template, $this->get_field_name(), $this->get_value());
    }

    /**
     * Fonction de vérification du champ saisi ou sélectionné
     *
     * @param int $valeur Champ saisi ou sélectionné
     * @return boolean true si vide
     */
    public function is_empty($valeur)
    {
        return empty(trim($valeur));
    }

    /**
     * Retourne la source
     *
     * @return Semantic|null
     */
    protected function get_source()
    {
        if ($this->source === null) {
            $aiSettings = AISettingsOrm::fetchActiveAiSettings();
            if (!empty($aiSettings)) {
                $this->source = new Semantic($aiSettings);
            }
        }
        return $this->source;
    }

    public function make_human_query()
    {

        $value = $this->get_value();

        return [
            $value
        ];
    }

    public function make_search()
    {
        $table_name = "ai_search_" . md5(microtime(true));
        $query = "CREATE TEMPORARY TABLE IF NOT EXISTS ".$table_name." (
            notice_id int(11) NOT NULL,
            pert decimal(16,1) default 1
        ) ENGINE=".$this->search->current_engine;
        pmb_mysql_query($query);

        $query = "ALTER TABLE ".$table_name." ADD INDEX notice_id (notice_id)";
        pmb_mysql_query($query);

        $user_query = $this->get_value();
        if ($this->is_empty($user_query)) {
            return $table_name;
        }

        $result = $this->get_source()?->search($user_query);
        if (empty($result) || $result['object'] === Semantic::OBJECT_RETRY_AFTER) {
            return $table_name;
        }

        $recordsId = [];
        $query = "INSERT INTO ".$table_name." (notice_id, pert) VALUES ";
        $values = [];

        foreach ($result['data'] as $object) {
            if ($object['object_type'] !== TYPE_NOTICE) {
                continue;
            }

            if (!in_array($object['object_id'], $recordsId)) {
                $values[] = "(" . $object['object_id'] . ", " . $object['score'] . ")";
            }
        }

        if (!empty($values)) {
            $query .= implode(', ', $values);
            pmb_mysql_query($query);
        }

        return $table_name;
    }

    /**
     * formulaire responsive
     *
     * @return string
     */
    public function get_input_box_responsive()
    {
        global $charset;
        //Récupération de la valeur de saisie
        $valeur_ = "field_".$this->n_ligne."_s_".$this->id;
        global ${$valeur_};
        if (json_validate(stripslashes(${$valeur_}))) {
            $valeur = json_decode(stripslashes(${$valeur_}));
        } else {
            $valeur = ${$valeur_};
        }
        $user_query = "<span class='search_value'><input type='text' name='field_".$this->n_ligne."_s_".$this->id."' value='".htmlentities($valeur[0], ENT_QUOTES, $charset)."' /></span>";
        return $user_query;
    }

    /**
     * test de la visibilite en fonction du parametre ai_active
     * @return boolean
     */
    public static function check_visibility() {
        global $ai_active;
        if($ai_active) {
            return true;
        } else {
            return false;
        }
    }
}
