#ifndef OBELISK_INCLUDE_OBELISK_PROGRAM_H
#define OBELISK_INCLUDE_OBELISK_PROGRAM_H

/**
 * @brief Struct wrapper around Obelisk class.
 *
 */
typedef struct CObelisk CObelisk;

#ifdef __cplusplus
extern "C"
{
#endif

    /**
     * @brief Create an obelisk object.
     *
     * @param[in] filename The obelisk KnowledgeBase file to use.
     * @return CObelisk* Returns an obelisk object.
     */
    extern CObelisk* obelisk_open(const char* filename);

    /**
     * @brief Delete an obelisk object.
     *
     * @param[in] obelisk The obelisk object.
     */
    extern void obelisk_close(CObelisk* obelisk);

    /**
     * @brief Get the obelisk version.
     *
     * @param[in] obelisk The obelisk object.
     * @return const char* Returns a string containing the version. This must be
     * freed by the caller.
     */
    extern char* obelisk_get_version(CObelisk* obelisk);

    /**
     * @brief Query the obelisk KnowledgeBase to see if a Fact is true or false.
     *
     * @param[in] obelisk The obelisk object.
     * @param[in] left_entity The left entity.
     * @param[in] verb The verb.
     * @param[in] right_entity The right entity.
     * @return double Returns whether the Fact is true or false.
     */
    extern double obelisk_query(CObelisk* obelisk,
        const char* left_entity,
        const char* verb,
        const char* right_entity);

    /**
     * @brief Query the obelisk KnowledgeBase to get a suggested Action to do.
     *
     * @param[in] obelisk The obelisk object.
     * @param[in] left_entity The left entity.
     * @param[in] verb The verb.
     * @param[in] right_entity The right entity.
     * @return char* Returns the Action to do or an empty string if there is no
     * action.
     */
    extern char* obelisk_query_action(CObelisk* obelisk,
        const char* left_entity,
        const char* verb,
        const char* right_entity);

    /**
     * @brief Get the obelisk library so version.
     *
     * @param[in] obelisk The obelisk object.
     * @return int Returns the so version.
     */
    extern int obelisk_get_lib_version(CObelisk* obelisk);

#ifdef __cplusplus
};
#endif

#endif
