<?php

/* For licensing terms, see /license.txt */

/**
 * Class wrapper.
 */
class ChamiloIndexer extends XapianIndexer
{
    /**
     * Set terms on search_did given.
     *
     * @param string $terms_string        Comma-separated list of terms from input form
     * @param string $prefix              Search engine prefix
     * @param string $course_code         Course code
     * @param string $tool_id             Tool id from mainapi.lib.php
     * @param int    $ref_id_high_level   Main id of the entity to index (Ex. lp_id)
     * @param int    $ref_id_second_level Secondary id of the entity to index (Ex. lp_item)
     * @param int    $search_did          Search engine document id from search_engine_ref table
     *
     * @return bool False on error or nothing to do, true otherwise
     */
    public function set_terms(
        $terms_string,
        $prefix,
        $course_code,
        $tool_id,
        $ref_id_high_level,
        $ref_id_second_level,
        $search_did
    ) {
        $terms_string = trim($terms_string);
        $terms = explode(',', $terms_string);
        array_walk($terms, 'trim_value');

        $stored_terms = $this->get_terms_on_db($prefix, $course_code, $tool_id, $ref_id_high_level);

        // don't do anything if no change, verify only at DB, not the search engine
        if ((0 == count(array_diff($terms, $stored_terms))) &&
            (0 == count(array_diff($stored_terms, $terms)))
        ) {
            return false;
        }

        require_once api_get_path(LIBRARY_PATH).'search/xapian/XapianQuery.php';

        // compare terms
        $doc = $this->get_document($search_did);
        $xapian_terms = xapian_get_doc_terms($doc, $prefix);
        $xterms = [];
        foreach ($xapian_terms as $xapian_term) {
            $xterms[] = substr($xapian_term['name'], 1);
        }

        $dterms = $terms;

        $missing_terms = array_diff($dterms, $xterms);
        $deprecated_terms = array_diff($xterms, $dterms);

        // save it to search engine
        foreach ($missing_terms as $term) {
            $this->add_term_to_doc($prefix.$term, $doc);
        }
        foreach ($deprecated_terms as $term) {
            $this->remove_term_from_doc($prefix.$term, $doc);
        }

        // don't do anything if no change
        if ((count($missing_terms) > 0) || (count($deprecated_terms) > 0)) {
            $this->replace_document($doc, (int) $search_did);
        }

        return true;
    }

    /**
     * Get the terms stored at database.
     *
     * @return array Array of terms
     */
    public function get_terms_on_db($prefix, $course_code, $tool_id, $ref_id)
    {
        require_once api_get_path(LIBRARY_PATH).'specific_fields_manager.lib.php';
        $terms = get_specific_field_values_list_by_prefix(
            $prefix,
            $course_code,
            $tool_id,
            $ref_id
        );
        $prefix_terms = [];
        foreach ($terms as $term) {
            $prefix_terms[] = $term['value'];
        }

        return $prefix_terms;
    }
}
