cmake_minimum_required(VERSION 3.16)
project(helink LANGUAGES CXX)

# HeLink 禾光 — cross-platform client (Linux + macOS).
# Windows build stays in client-win/ (MSBuild + .vcxproj); this is the
# Qt6/CMake replacement for everything else.
#
# Build (Linux/Ubuntu/Debian):
#   sudo apt install qt6-base-dev qt6-websockets-dev libx11-dev libxext-dev \
#                    libxtst-dev libxfixes-dev libpulse-dev libasound2-dev
#   cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
#   cmake --build build -j$(nproc)
#
# Build (macOS, with Homebrew):
#   brew install qt cmake
#   cmake -S . -B build -DCMAKE_BUILD_TYPE=Release \
#         -DCMAKE_PREFIX_PATH=$(brew --prefix qt)
#   cmake --build build -j$(sysctl -n hw.ncpu)
#
# Produces: build/helink (Linux) or build/HeLink.app (macOS bundle)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)

# Match the Windows version's app metadata so the signaling server sees the
# same user-agent / version banner regardless of OS.
set(HELINK_VERSION "0.46.12")
add_compile_definitions(HELINK_VERSION="${HELINK_VERSION}")

if(APPLE)
    set(CMAKE_OSX_DEPLOYMENT_TARGET "11.0" CACHE STRING "Min macOS")
endif()

# Qt6 — Widgets + Network + WebSockets cover everything the UI needs.
find_package(Qt6 6.2 REQUIRED COMPONENTS Core Gui Widgets Network WebSockets)

# ─── Sources ────────────────────────────────────────────────────────────
set(SHARED_SRCS
    shared/Protocol.h
    shared/Signaling.h
    shared/Signaling.cpp
    shared/OpenH264Codec.h
    shared/OpenH264Codec.cpp
    shared/FileTransfer.h
    shared/FileTransfer.cpp
    shared/P2PTransport.h
    shared/P2PTransport.cpp
    shared/InputEvent.h
    shared/Theme.h
)

set(UI_SRCS
    ui/MainWindow.h
    ui/MainWindow.cpp
    ui/LoginDialog.h
    ui/LoginDialog.cpp
    ui/RemoteSessionWindow.h
    ui/RemoteSessionWindow.cpp
    ui/FileBrowserDialog.h
    ui/FileBrowserDialog.cpp
    ui/AboutDialog.h
    ui/AboutDialog.cpp
    ui/BannerWidget.h
    ui/BannerWidget.cpp
    ui/resources.qrc
)

# Platform-specific implementations of the abstract interfaces in
# shared/ScreenCapture.h, shared/AudioCapture.h, shared/InputInjector.h.
if(APPLE)
    set(PLATFORM_SRCS
        platform/mac/ScreenCapture_CG.mm
        platform/mac/InputInjector_CG.mm
        platform/mac/AudioCapture_CA.mm
        platform/mac/AudioPlayer_CA.mm
    )
    set_source_files_properties(${PLATFORM_SRCS} PROPERTIES
        COMPILE_FLAGS "-fobjc-arc")
elseif(UNIX)
    set(PLATFORM_SRCS
        platform/linux/ScreenCapture_X11.cpp
        platform/linux/InputInjector_XTest.cpp
        platform/linux/InputInjector_Uinput.cpp
        platform/linux/AudioCapture_Pulse.cpp
        platform/linux/AudioPlayer_Pulse.cpp
    )
endif()

add_executable(helink
    main.cpp
    ${SHARED_SRCS}
    ${UI_SRCS}
    ${PLATFORM_SRCS}
)

target_include_directories(helink PRIVATE
    ${CMAKE_CURRENT_SOURCE_DIR}
    ${CMAKE_CURRENT_SOURCE_DIR}/shared
    ${CMAKE_CURRENT_SOURCE_DIR}/ui
    ${CMAKE_CURRENT_SOURCE_DIR}/../client-win/third_party  # nlohmann/json + openh264 headers
)

target_link_libraries(helink PRIVATE
    Qt6::Core
    Qt6::Gui
    Qt6::Widgets
    Qt6::Network
    Qt6::WebSockets
)

# ─── Platform link bits ─────────────────────────────────────────────────
if(APPLE)
    target_link_libraries(helink PRIVATE
        "-framework Cocoa"
        "-framework CoreGraphics"
        "-framework CoreFoundation"
        "-framework ApplicationServices"
        "-framework AudioUnit"
        "-framework AudioToolbox"
        "-framework CoreAudio"
        "-framework AVFoundation"
    )
    set_target_properties(helink PROPERTIES
        MACOSX_BUNDLE TRUE
        OUTPUT_NAME "HeLink"
        MACOSX_BUNDLE_BUNDLE_NAME "HeLink"
        MACOSX_BUNDLE_BUNDLE_VERSION "${HELINK_VERSION}"
        MACOSX_BUNDLE_SHORT_VERSION_STRING "${HELINK_VERSION}"
        MACOSX_BUNDLE_GUI_IDENTIFIER "com.helink.HeLink"
        MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/platform/mac/Info.plist.in"
    )
elseif(UNIX)
    find_package(PkgConfig REQUIRED)
    pkg_check_modules(X11      REQUIRED IMPORTED_TARGET x11)
    pkg_check_modules(XEXT     REQUIRED IMPORTED_TARGET xext)
    pkg_check_modules(XTST     REQUIRED IMPORTED_TARGET xtst)
    pkg_check_modules(XFIXES   REQUIRED IMPORTED_TARGET xfixes)
    pkg_check_modules(PULSE    REQUIRED IMPORTED_TARGET libpulse libpulse-simple)
    target_link_libraries(helink PRIVATE
        PkgConfig::X11 PkgConfig::XEXT PkgConfig::XTST PkgConfig::XFIXES
        PkgConfig::PULSE
        dl pthread)
endif()

# ─── Install ────────────────────────────────────────────────────────────
if(UNIX AND NOT APPLE)
    install(TARGETS helink RUNTIME DESTINATION bin)
    install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/platform/linux/helink.desktop
            DESTINATION share/applications)
    install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/../assets/helink-256.png
            DESTINATION share/icons/hicolor/256x256/apps RENAME helink.png
            OPTIONAL)
endif()
