cmake_minimum_required(VERSION 3.5)
project(kylin-cloud-ai-engine-plugin LANGUAGES C CXX)

set(CMAKE_CXX_STANDARD 17)

find_package(KylinAiEngine CONFIG REQUIRED)
find_package(PkgConfig REQUIRED)

find_package(CURL REQUIRED)

pkg_check_modules(FREEIMAGE QUIET freeimage)
if(FREEIMAGE_FOUND AND FREEIMAGE_LIBRARIES)
    set(XUNFEI_FREEIMAGE_LIB ${FREEIMAGE_LIBRARIES})
    set(XUNFEI_FREEIMAGE_INCLUDE_DIRS ${FREEIMAGE_INCLUDE_DIRS})
else()
    find_library(XUNFEI_FREEIMAGE_LIB NAMES freeimage FreeImage libfreeimage-3 libfreeimage REQUIRED)
    find_path(XUNFEI_FREEIMAGE_INCLUDE_DIR NAMES FreeImage.h REQUIRED)
    set(XUNFEI_FREEIMAGE_INCLUDE_DIRS ${XUNFEI_FREEIMAGE_INCLUDE_DIR})
endif()

include_directories(${CMAKE_CURRENT_SOURCE_DIR})
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/third-party/cpr/include)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/third-party/libhv-v1.3.3)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/third-party/libhv-v1.3.3/base)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/third-party/libhv-v1.3.3/cpputil)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/third-party/libhv-v1.3.3/event)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/third-party/libhv-v1.3.3/evpp)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/third-party/libhv-v1.3.3/http)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/third-party/libhv-v1.3.3/http/client)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/third-party/libhv-v1.3.3/ssl)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/third-party/libhv-v1.3.3/util)

add_subdirectory(third-party/cpr)

kylin_ai_add_engine_plugin(xunfei-engine-plugin AI_ENGINE
    ${CMAKE_CURRENT_SOURCE_DIR}/xunfei/xunfeiengine.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/xunfei/nlp/xunfeinlpengine_p.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/xunfei/nlp/xunfeinlpengine.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/xunfei/nlp/servererror.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/xunfei/nlp/token.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/xunfei/nlp/util.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/xunfei/logger.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/xunfei/vision/xunfeivisionengine_p.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/xunfei/vision/xunfeivisionengine.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/xunfei/vision/imageloader.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/xunfei/vision/servererror.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/xunfei/vision/token.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/xunfei/vision/util.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/xunfei/speech/xunfeispeechengine_p.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/xunfei/speech/xunfeispeechengine.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/xunfei/speech/servererror.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/xunfei/speech/util.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/third-party/libhv-v1.3.3/base/hbase.c
    ${CMAKE_CURRENT_SOURCE_DIR}/third-party/libhv-v1.3.3/base/hlog.c
    ${CMAKE_CURRENT_SOURCE_DIR}/third-party/libhv-v1.3.3/base/hsocket.c
    ${CMAKE_CURRENT_SOURCE_DIR}/third-party/libhv-v1.3.3/base/htime.c

    ${CMAKE_CURRENT_SOURCE_DIR}/third-party/libhv-v1.3.3/http/wsdef.c
    ${CMAKE_CURRENT_SOURCE_DIR}/third-party/libhv-v1.3.3/http/websocket_parser.c

    ${CMAKE_CURRENT_SOURCE_DIR}/third-party/libhv-v1.3.3/ssl/openssl.c
    ${CMAKE_CURRENT_SOURCE_DIR}/third-party/libhv-v1.3.3/ssl/hssl.c

    ${CMAKE_CURRENT_SOURCE_DIR}/third-party/libhv-v1.3.3/util/base64.c
    ${CMAKE_CURRENT_SOURCE_DIR}/third-party/libhv-v1.3.3/util/sha1.c

    ${CMAKE_CURRENT_SOURCE_DIR}/third-party/libhv-v1.3.3/event/hloop.c
    ${CMAKE_CURRENT_SOURCE_DIR}/third-party/libhv-v1.3.3/event/hevent.c
    ${CMAKE_CURRENT_SOURCE_DIR}/third-party/libhv-v1.3.3/event/epoll.c
    ${CMAKE_CURRENT_SOURCE_DIR}/third-party/libhv-v1.3.3/event/nio.c
    ${CMAKE_CURRENT_SOURCE_DIR}/third-party/libhv-v1.3.3/event/unpack.c

    ${CMAKE_CURRENT_SOURCE_DIR}/third-party/libhv-v1.3.3/cpputil/hstring.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/third-party/libhv-v1.3.3/cpputil/hurl.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/third-party/libhv-v1.3.3/cpputil/ThreadLocalStorage.cpp

    ${CMAKE_CURRENT_SOURCE_DIR}/third-party/libhv-v1.3.3/http/http_parser.c
    ${CMAKE_CURRENT_SOURCE_DIR}/third-party/libhv-v1.3.3/http/httpdef.c
    ${CMAKE_CURRENT_SOURCE_DIR}/third-party/libhv-v1.3.3/http/multipart_parser.c

    ${CMAKE_CURRENT_SOURCE_DIR}/third-party/libhv-v1.3.3/http/http_content.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/third-party/libhv-v1.3.3/http/client/WebSocketClient.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/third-party/libhv-v1.3.3/http/WebSocketChannel.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/third-party/libhv-v1.3.3/http/WebSocketParser.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/third-party/libhv-v1.3.3/http/HttpMessage.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/third-party/libhv-v1.3.3/http/HttpParser.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/third-party/libhv-v1.3.3/http/Http1Parser.cpp
)

target_link_libraries(xunfei-engine-plugin cpr ${CURL_LIBRARIES})
target_link_libraries(xunfei-engine-plugin ${XUNFEI_FREEIMAGE_LIB})
target_include_directories(xunfei-engine-plugin PRIVATE ${CURL_INCLUDE_DIRS} ${XUNFEI_FREEIMAGE_INCLUDE_DIRS})
target_compile_definitions(xunfei-engine-plugin PRIVATE WITH_OPENSSL)

kylin_ai_add_engine_plugin(deepseek-engine-plugin AI_ENGINE
    ${CMAKE_CURRENT_SOURCE_DIR}/deepseek/deepseekengine.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/deepseek/deepseeknlpengine_p.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/deepseek/deepseeknlpengine.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/deepseek/servererror.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/deepseek/util.cpp
)

target_link_libraries(deepseek-engine-plugin cpr ${CURL_LIBRARIES})
target_include_directories(deepseek-engine-plugin PRIVATE ${CURL_INCLUDE_DIRS})

kylin_ai_add_engine_plugin(qwen-engine-plugin AI_ENGINE
    ${CMAKE_CURRENT_SOURCE_DIR}/qwen/qwenengine.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/qwen/qwennlpengine_p.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/qwen/qwennlpengine.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/qwen/servererror.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/qwen/util.cpp
)

target_link_libraries(qwen-engine-plugin cpr ${CURL_LIBRARIES})
target_include_directories(qwen-engine-plugin PRIVATE ${CURL_INCLUDE_DIRS})

kylin_ai_add_engine_plugin(custom-engine-plugin AI_ENGINE
    ${CMAKE_CURRENT_SOURCE_DIR}/custom/customengine.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/custom/customnlpengine_p.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/custom/customnlpengine.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/custom/servererror.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/custom/util.cpp
)

target_link_libraries(custom-engine-plugin cpr ${CURL_LIBRARIES})
target_include_directories(custom-engine-plugin PRIVATE ${CURL_INCLUDE_DIRS})

option(ENABLE_TEST "Build Test" OFF)

if (ENABLE_TEST)
    enable_testing()
    add_subdirectory(test)
endif ()
