cmake_minimum_required(VERSION 3.16)
project(vibechat 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)

# FFmpeg - custom built shared libraries
set(FFMPEG_INSTALL_DIR "${CMAKE_SOURCE_DIR}/ffmpeg/ffmpeg_build/install")
set(ENV{PKG_CONFIG_PATH} "${FFMPEG_INSTALL_DIR}/lib/pkgconfig")
find_package(PkgConfig QUIET)
if(PkgConfig_FOUND)
    pkg_check_modules(FFMPEG_PC libavcodec libavformat libavutil libswscale libswresample IMPORTED_TARGET)
    if(FFMPEG_PC_FOUND)
        set(FFMPEG_FOUND TRUE)
        set(FFMPEG_TARGET PkgConfig::FFMPEG_PC)
        set(FFMPEG_INCLUDE_DIRS "${FFMPEG_PC_INCLUDE_DIRS}")
    endif()
endif()
if(NOT FFMPEG_FOUND)
    message(STATUS "pkg-config search failed, trying direct library search")
    find_path(FFMPEG_INCLUDE_DIR libavcodec/avcodec.h PATHS "${FFMPEG_INSTALL_DIR}/include" NO_DEFAULT_PATH)
    find_library(AVCODEC_LIBRARY avcodec PATHS "${FFMPEG_INSTALL_DIR}/lib" NO_DEFAULT_PATH)
    find_library(AVFORMAT_LIBRARY avformat PATHS "${FFMPEG_INSTALL_DIR}/lib" NO_DEFAULT_PATH)
    find_library(AVUTIL_LIBRARY avutil PATHS "${FFMPEG_INSTALL_DIR}/lib" NO_DEFAULT_PATH)
    find_library(SWSCALE_LIBRARY swscale PATHS "${FFMPEG_INSTALL_DIR}/lib" NO_DEFAULT_PATH)
    find_library(SWRESAMPLE_LIBRARY swresample PATHS "${FFMPEG_INSTALL_DIR}/lib" NO_DEFAULT_PATH)
    if(FFMPEG_INCLUDE_DIR AND AVCODEC_LIBRARY AND AVFORMAT_LIBRARY AND AVUTIL_LIBRARY)
        set(FFMPEG_FOUND TRUE)
        set(FFMPEG_INCLUDE_DIRS "${FFMPEG_INCLUDE_DIR}")
        set(FFMPEG_LIBRARIES "${AVCODEC_LIBRARY}" "${AVFORMAT_LIBRARY}" "${AVUTIL_LIBRARY}" "${SWSCALE_LIBRARY}" "${SWRESAMPLE_LIBRARY}")
        message(STATUS "FFmpeg found via direct search")
    endif()
endif()
if(NOT FFMPEG_FOUND)
    message(WARNING "FFmpeg not found at ${FFMPEG_INSTALL_DIR}. Video transcoding disabled. Run ./ffmpeg/build_ffmpeg.sh to enable.")
    set(FFMPEG_TARGET "")
    set(FFMPEG_LIBRARIES "")
    set(FFMPEG_INCLUDE_DIRS "")
endif()
if(UNIX AND NOT APPLE AND FFMPEG_FOUND)
    set(CMAKE_BUILD_RPATH "${FFMPEG_INSTALL_DIR}/lib")
    set(CMAKE_INSTALL_RPATH "${FFMPEG_INSTALL_DIR}/lib")
endif()

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

add_executable(vibechat
    src/main.cpp
    src/mainwindow.cpp
    src/channellist.cpp
    src/creategroupdialog.cpp
    src/channeldelegate.cpp
    src/channelsettingsdialog.cpp
    src/chatview.cpp
    src/messagedelegate.cpp
    src/messagelist.cpp
    src/accountlist.cpp
    src/accountdelegate.cpp
    src/flagpainter.cpp
    src/memberpropsdialog.cpp
    src/renamedialog.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/inviteby.cpp
    src/joindialog.cpp
    src/settingsdialog.cpp
    src/networksettingspage.cpp
    src/databasesettingspage.cpp
    src/statuspage.cpp
    src/nodespage.cpp
    src/soundsettingspage.cpp
    src/sound_manager.cpp
    src/audiorecorder.cpp
    src/voicemessageencoder.cpp
    src/voiceplayback.cpp
    src/media_blocks.cpp
    src/videoplayer_engine.cpp
    src/videoplayer_window.cpp
    src/imageviewer_window.cpp
    src/audiodevicesettingspage.cpp
    src/storagesettingspage.cpp
    src/connmonitorwindow.cpp
    transport/utun_node.cpp
    transport/node_config.cpp
    transport/config_updater.cpp
    transport/gui_bridge_impl.cpp
    transport/miniaudio_impl.c
    db/db_manager.cpp
    ../../lib/sqlite3.c
    resources/chatgui.qrc
)

target_include_directories(vibechat PRIVATE ${CMAKE_SOURCE_DIR}/../../lib ${CMAKE_SOURCE_DIR}/../../src ${CMAKE_SOURCE_DIR}/db ${CMAKE_SOURCE_DIR}/../../lib/libopus/include ${FFMPEG_INCLUDE_DIRS})
target_compile_definitions(vibechat PRIVATE SQLITE_THREADSAFE=1 USE_SQLITE)
if(FFMPEG_FOUND)
    target_compile_definitions(vibechat PRIVATE HAVE_FFMPEG)
endif()
set_source_files_properties(../../lib/sqlite3.c transport/miniaudio_impl.c PROPERTIES LANGUAGE C)
if(WIN32)
    target_link_libraries(vibechat PRIVATE ${QT_LIBS} rlottie::rlottie ZLIB::ZLIB OpenSSL::Crypto ZXing::ZXing utun pthread ${FFMPEG_TARGET} ${FFMPEG_LIBRARIES})
else()
    target_link_libraries(vibechat PRIVATE ${QT_LIBS} rlottie::rlottie ZLIB::ZLIB OpenSSL::Crypto ZXing::ZXing utun pthread dl ${FFMPEG_TARGET} ${FFMPEG_LIBRARIES})
endif()

# ============================================================================
# Tests
# ============================================================================
add_executable(test_member_sync
    ../../lib/sqlite3.c
    ../../tests/test_member_sync.c
)
target_include_directories(test_member_sync PRIVATE
    transport ${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/../../lib
    ${CMAKE_SOURCE_DIR}/../../src
    zxing-cpp/core/src ../../tests
)
target_compile_definitions(test_member_sync PRIVATE USE_SQLITE SQLITE_THREADSAFE=1)
set_source_files_properties(../../lib/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)

# smoke-тест видео-декодера (FFmpeg). Ручной запуск: test_video_engine <mp4>
add_executable(test_video_engine
    tests/test_video_engine.cpp
    src/videoplayer_engine.cpp
    src/sound_manager.cpp
    transport/miniaudio_impl.c
)
target_include_directories(test_video_engine PRIVATE ${CMAKE_SOURCE_DIR}/../../lib ${CMAKE_SOURCE_DIR}/../../src ${CMAKE_SOURCE_DIR}/db ${CMAKE_SOURCE_DIR}/../../lib/libopus/include ${FFMPEG_INCLUDE_DIRS})
target_compile_definitions(test_video_engine PRIVATE USE_SQLITE SQLITE_THREADSAFE=1)
if(FFMPEG_FOUND)
    target_compile_definitions(test_video_engine PRIVATE HAVE_FFMPEG)
endif()
set_source_files_properties(transport/miniaudio_impl.c PROPERTIES LANGUAGE C)
if(WIN32)
    target_link_libraries(test_video_engine PRIVATE ${QT_LIBS} ${QT_CORE} utun pthread ${FFMPEG_TARGET} ${FFMPEG_LIBRARIES})
else()
    target_link_libraries(test_video_engine PRIVATE ${QT_LIBS} ${QT_CORE} utun pthread dl ${FFMPEG_TARGET} ${FFMPEG_LIBRARIES})
endif()
