<?php
/* For licensing terms, see /license.txt */

/**
 * @package chamilo.include.search
 */

// some constants to avoid serialize string keys on serialized data array
define('SE_COURSE_ID', 0);
define('SE_TOOL_ID', 1);
define('SE_DATA', 2);
define('SE_USER', 3);

// in some cases we need top differenciate xapian documents of the same tool
define('SE_DOCTYPE_EXERCISE_EXERCISE', 0);
define('SE_DOCTYPE_EXERCISE_QUESTION', 1);

// xapian prefixes
define('XAPIAN_PREFIX_COURSEID', 'C');
define('XAPIAN_PREFIX_TOOLID', 'O');

/**
 * Class.
 *
 * @package chamilo.include.search
 */
abstract class _IndexableChunk
{
    /* struct (array)
     * {
     *     string title; <- nombre de archivo/elemento
     *     string content; <- texto a indexar
     *     string ids;  <- los flags a guardar "cidReq:lp_id:path"
     * }
     */

    public $data;

    /**
     * array (
     * 'SE_COURSE_ID' => string <- course id from course table on main db
     * 'SE_TOOL_ID' => string <- tool id from mainapi lib constants
     * 'SE_DATA' => mixed <- extra information, depends on SE_TOOL_ID
     * 'SE_USER' => id <- user id from user table in main db
     * ).
     */
    public $xapian_data;

    /**
     * array(
     *   name => string
     *   flag => char
     * ).
     */
    public $terms;

    /**
     * Class constructor. Just generates an empty 'data' array attribute.
     */
    public function __construct()
    {
        $this->data = [];
    }

    /**
     * Class desctructor. Unsets attributes.
     */
    public function __destruct()
    {
        unset($this->data);
        unset($this->terms);
    }

    /**
     * Add a value to the indexed item.
     *
     * @param  string  Key
     * @param  string  Value
     */
    public function addValue($key, $value)
    {
        $this->data[$key] = $value;
    }

    /**
     * Add a term (like xapian definition).
     *
     * @param string Term
     * @param string Flag (one character)
     */
    public function addTerm($term, $flag)
    {
        global $charset;
        if (strlen($flag) == 1) {
            $this->terms[] = ['name' => api_convert_encoding(stripslashes($term), 'UTF-8', $charset), 'flag' => $flag];
        }
    }
}

/**
 * Extension of the _IndexableChunk class to make IndexableChunk extensible.
 *
 * @package chamilo.include.search
 */
class IndexableChunk extends _IndexableChunk
{
    /**
     * Let add course id term.
     */
    public function addCourseId($course_id)
    {
        $this->addTerm($course_id, XAPIAN_PREFIX_COURSEID);
    }

    /**
     * Let add tool id term.
     */
    public function addToolId($tool_id)
    {
        $this->addTerm($tool_id, XAPIAN_PREFIX_TOOLID);
    }
}