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)

find_package(Qt5 COMPONENTS Widgets Network Test QUIET)
if(NOT Qt5_FOUND)
    find_package(Qt6 COMPONENTS Widgets Network Test REQUIRED)
    set(QT_LIBS Qt6::Widgets Qt6::Network)
    set(QT_TEST_LIB Qt6::Test)
else()
    set(QT_LIBS Qt5::Widgets Qt5::Network)
    set(QT_TEST_LIB Qt5::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)

add_executable(chatgui
    src/main.cpp
    src/mainwindow.cpp
    src/channellist.cpp
    src/channeldelegate.cpp
    src/chatview.cpp
    src/messagedelegate.cpp
    src/messagelist.cpp
    src/accountlist.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
    transport/msg_client.cpp
    transport/crypto.cpp
    transport/chat_propagator.cpp
    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)
set_source_files_properties(db/sqlite3.c PROPERTIES LANGUAGE C)
target_link_libraries(chatgui PRIVATE ${QT_LIBS} rlottie::rlottie ZLIB::ZLIB OpenSSL::Crypto ZXing::ZXing pthread dl)

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

enable_testing()

add_executable(test_crypto
    tests/test_crypto.cpp
    transport/crypto.cpp
)
target_include_directories(test_crypto PRIVATE ${CMAKE_SOURCE_DIR})
target_link_libraries(test_crypto PRIVATE Qt5::Core ${QT_TEST_LIB} OpenSSL::Crypto pthread)
add_test(NAME test_crypto COMMAND test_crypto)
