#ifndef OBELISK_INCLUDE_OBELISK_WRAPPER_H
#define OBELISK_INCLUDE_OBELISK_WRAPPER_H

#include "include/obelisk_c.h"

#ifdef __cplusplus
extern "C"
{
#endif

    /**
     * @brief Create a obelisk object.
     *
     * @param[in] filename The name of the obelisk KnowledgeBase file to use.
     * @return CObelisk* Returns the obelisk object.
     */
    CObelisk *create_obelisk(const char *filename);

    /**
     * @brief Calls the obelisk method getVersion.
     *
     * @param[in] p_obelisk The obelisk object pointer.
     * @return char* Returns the version. This must be freed by the
     * caller.
     */
    char *call_obelisk_getVersion(CObelisk *p_obelisk);

    /**
     * @brief Calls the obelisk method getLibVersion.
     *
     * @param[in] p_obelisk The obelisk object pointer.
     * @return int Returns the library so version.
     */
    int call_obelisk_getLibVersion(CObelisk *p_obelisk);

    /**
     * @brief Calls the obelisk method query.
     *
     * @param[in] p_obelisk The obelisk object pointer.
     * @param[in] left_entity The left entity.
     * @param[in] verb The verb.
     * @param[in] right_entity The right entity.
     * @return double Returns whether or not the Fact is true.
     */
    double call_obelisk_query(CObelisk *p_obelisk,
        const char *left_entity,
        const char *verb,
        const char *right_entity);

    /**
     * @brief Calls the obelisk method queryAction.
     *
     * @param[in] p_obelisk The obelisk object pointer.
     * @param[in] left_entity The left entity.
     * @param[in] verb The verb.
     * @param[in] right_entity The right entity.
     * @return char* Returns the sugggested action to take or an empty string if
     * no action is found. This must be freed by the caller.
     */
    char *call_obelisk_queryAction(CObelisk *p_obelisk,
        const char *left_entity,
        const char *verb,
        const char *right_entity);

    /**
     * @brief Delete a obelisk object.
     *
     * @param[in] p_obelisk The obelisk object pointer.
     */
    void destroy_obelisk(CObelisk *p_obelisk);

#ifdef __cplusplus
};
#endif

#endif
