cmake_minimum_required(VERSION 3.16)
project(chatgui VERSION 0.1.0 LANGUAGES C CXX)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_C_STANDARD 99)

find_package(OpenSSL REQUIRED)

find_package(Qt6 COMPONENTS Widgets Network Test QUIET)
if(NOT Qt6_FOUND)
    find_package(Qt5 COMPONENTS Widgets Network Test REQUIRED)
    set(QT_LIBS Qt5::Widgets Qt5::Network)
    set(QT_CORE  Qt5::Core)
    set(QT_TEST_LIB Qt5::Test)
else()
    set(QT_LIBS Qt6::Widgets Qt6::Network)
    set(QT_CORE  Qt6::Core)
    set(QT_TEST_LIB Qt6::Test)
endif()

find_package(rlottie REQUIRED)
find_package(ZLIB REQUIRED)
find_package(OpenSSL REQUIRED)

set(ZXING_READERS ON CACHE BOOL "")
set(ZXING_WRITERS "OLD" CACHE STRING "")
set(ZXING_ENABLE_QRCODE ON CACHE BOOL "")
set(ZXING_ENABLE_AZTEC OFF CACHE BOOL "")
set(ZXING_ENABLE_DATAMATRIX OFF CACHE BOOL "")
set(ZXING_ENABLE_MAXICODE OFF CACHE BOOL "")
set(ZXING_ENABLE_PDF417 OFF CACHE BOOL "")
set(ZXING_ENABLE_1D OFF CACHE BOOL "")
set(ZXING_C_API OFF CACHE BOOL "")
set(ZXING_EXAMPLES OFF CACHE BOOL "")
set(ZXING_EXAMPLES_QT OFF CACHE BOOL "")
set(ZXING_BLACKBOX_TESTS OFF CACHE BOOL "")
set(ZXING_UNIT_TESTS OFF CACHE BOOL "")
set(BUILD_SHARED_LIBS OFF CACHE BOOL "")
add_subdirectory(zxing-cpp)
set_target_properties(ZXing PROPERTIES AUTOMOC OFF)

# uTun core library (C, built from ../src/ and ../lib/)
add_subdirectory(libutun)

add_executable(chatgui
    src/main.cpp
    src/mainwindow.cpp
    src/channellist.cpp
    src/creategroupdialog.cpp
    src/channeldelegate.cpp
    src/chatview.cpp
    src/messagedelegate.cpp
    src/messagelist.cpp
    src/accountlist.cpp
    src/memberlistmodel.cpp
    src/emoji.cpp
    src/emojipanel.cpp
    src/emojitabbar.cpp
    src/inputbar.cpp
    src/lottieicon.cpp
    src/animtimer.cpp
    src/qrcode_utils.cpp
    src/invite_link.cpp
    src/invitedialog.cpp
    src/joindialog.cpp
    src/settingsdialog.cpp
    src/networksettingspage.cpp
    transport/utun_node.cpp
    transport/node_config.cpp
    transport/config_updater.cpp
    transport/gui_bridge_impl.cpp
    transport/chat_core.c
    transport/chat_sync.c
    transport/member_sync.c
    transport/db_sync_stub.c
    transport/topo_node_sqlite.c
    db/db_manager.cpp
    db/sqlite3.c
    resources/chatgui.qrc
)

target_include_directories(chatgui PRIVATE ${CMAKE_SOURCE_DIR}/db)
target_compile_definitions(chatgui PRIVATE SQLITE_THREADSAFE=1 USE_SQLITE)
set_source_files_properties(db/sqlite3.c transport/chat_core.c transport/chat_sync.c transport/member_sync.c transport/db_sync_stub.c PROPERTIES LANGUAGE C)
if(WIN32)
    target_link_libraries(chatgui PRIVATE ${QT_LIBS} rlottie::rlottie ZLIB::ZLIB OpenSSL::Crypto ZXing::ZXing utun pthread)
else()
    target_link_libraries(chatgui PRIVATE ${QT_LIBS} rlottie::rlottie ZLIB::ZLIB OpenSSL::Crypto ZXing::ZXing utun pthread dl)
endif()

# ============================================================================
# Tests
# ============================================================================
add_executable(test_member_sync
    db/sqlite3.c
    ../../tests/test_member_sync.c
)
target_include_directories(test_member_sync PRIVATE
    transport ${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/db
    ${CMAKE_SOURCE_DIR}/../../src ${CMAKE_SOURCE_DIR}/../../lib
    zxing-cpp/core/src ../../tests
)
target_compile_definitions(test_member_sync PRIVATE USE_SQLITE SQLITE_THREADSAFE=1)
set_source_files_properties(db/sqlite3.c ../../tests/test_member_sync.c PROPERTIES LANGUAGE C)
if(WIN32)
    target_link_libraries(test_member_sync PRIVATE OpenSSL::Crypto pthread)
else()
    target_link_libraries(test_member_sync PRIVATE OpenSSL::Crypto pthread dl)
endif()

# ============================================================================
# Tests
# ============================================================================

enable_testing()

add_executable(test_config_updater
    tests/test_config_updater.cpp
    transport/config_updater.cpp
)
target_include_directories(test_config_updater PRIVATE ${CMAKE_SOURCE_DIR})
target_link_libraries(test_config_updater PRIVATE ${QT_CORE} pthread)
add_test(NAME test_config_updater COMMAND test_config_updater)
