cmake_minimum_required(VERSION 3.5)
project(lb_mqtt LANGUAGES C VERSION 0.0.1)

include(GNUInstallDirs)

option(BUILD_TEST "Build test_package" OFF)
option(BUILD_ENABLE_DBUS_SYSTEM "Run with DBus system bus" ON)
option(BUILD_ENABLE_DBUS_SESSION "Run with DBus session bus" ON)

message(STATUS "Start generating code")
# 如果设置了 CODEGEN_VERSION 则传递给 lbk gen（lbk test -cv 0.11 场景）
if(DEFINED CODEGEN_VERSION)
    message(STATUS "  Codegen version: ${CODEGEN_VERSION}")
    execute_process(COMMAND lbk gen -cv ${CODEGEN_VERSION} RESULT_VARIABLE ret)
else()
    execute_process(COMMAND lbk gen RESULT_VARIABLE ret)
endif()
if(ret AND NOT ret EQUAL 0)
    message(FATAL_ERROR "Generating code failed")
endif()
if (BUILD_TEST)
    add_definitions(-DBUILD_TEST)
endif()

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D__FILENAME__='\"$(notdir $(abspath $(patsubst %.o,%,$@)))\"'")

find_package(PkgConfig REQUIRED)
pkg_check_modules(LB_CORE REQUIRED lb_core)
pkg_check_modules(LB_BASE REQUIRED lb_base)
pkg_check_modules(GLIB2 REQUIRED glib-2.0)
pkg_check_modules(GIO2 REQUIRED gio-2.0)
pkg_check_modules(YYJSON REQUIRED yyjson)
pkg_check_modules(MOSQUITTO REQUIRED mosquitto)
pkg_check_modules(LB_MQTT_BROKER_PUBLIC REQUIRED lbMqttBroker-public)
pkg_check_modules(LB_MQTT_BROKER_SERVER REQUIRED lbMqttBroker-server)

if (CMAKE_BUILD_TYPE STREQUAL "Release")
    add_definitions("-DG_DISABLE_ASSERT")
endif()

# === Broker Manager 应用 ===
aux_source_directory(./src/broker SRC_BROKER)
aux_source_directory(./src/lib SRC_LIB)
list(SORT SRC_BROKER)
list(SORT SRC_LIB)
add_executable(${PROJECT_NAME} ${SRC_BROKER} ${SRC_LIB})

target_include_directories(${PROJECT_NAME} PUBLIC
    inc
    ${CMAKE_CURRENT_SOURCE_DIR}/inc
    ${LB_CORE_INCLUDE_DIRS}
    ${LB_BASE_INCLUDE_DIRS}
    ${LB_MQTT_BROKER_PUBLIC_INCLUDE_DIRS}
    ${LB_MQTT_BROKER_SERVER_INCLUDE_DIRS}
    ${GLIB2_INCLUDE_DIRS}
    ${GIO2_INCLUDE_DIRS}
    ${YYJSON_INCLUDE_DIRS}
    ${MOSQUITTO_INCLUDE_DIRS}
)
target_link_directories(${PROJECT_NAME} PUBLIC
    ${LB_CORE_LIBRARY_DIRS}
    ${LB_BASE_LIBRARY_DIRS}
    ${LB_MQTT_BROKER_PUBLIC_LIBRARY_DIRS}
    ${LB_MQTT_BROKER_SERVER_LIBRARY_DIRS}
    ${GLIB2_LIBRARY_DIRS}
    ${GIO2_LIBRARY_DIRS}
    ${YYJSON_LIBRARY_DIRS}
    ${MOSQUITTO_LIBRARY_DIRS}
    $ENV{HOME}/.local/lib64
)
target_link_libraries(${PROJECT_NAME} PUBLIC
    ${GLIB2_LIBRARIES}
    ${GIO2_LIBRARIES}
    ${LB_CORE_LIBRARIES}
    ${LB_BASE_LIBRARIES}
    ${LB_MQTT_BROKER_PUBLIC_LIBRARIES}
    ${LB_MQTT_BROKER_SERVER_LIBRARIES}
    ${YYJSON_LIBRARIES}
    ${MOSQUITTO_LIBRARIES}
)

# === MQTT Bridge 插件 ===
aux_source_directory(./src/plugin SRC_PLUGIN)
list(SORT SRC_PLUGIN)
add_library(mqtt_bridge SHARED ${SRC_PLUGIN} ${SRC_LIB})

target_include_directories(mqtt_bridge PUBLIC
    inc
    ${CMAKE_CURRENT_SOURCE_DIR}/inc
    ${LB_CORE_INCLUDE_DIRS}
    ${LB_BASE_INCLUDE_DIRS}
    ${LB_MQTT_BROKER_PUBLIC_INCLUDE_DIRS}
    ${GLIB2_INCLUDE_DIRS}
    ${GIO2_INCLUDE_DIRS}
    ${YYJSON_INCLUDE_DIRS}
    ${MOSQUITTO_INCLUDE_DIRS}
)
target_link_directories(mqtt_bridge PUBLIC
    ${LB_CORE_LIBRARY_DIRS}
    ${LB_BASE_LIBRARY_DIRS}
    ${LB_MQTT_BROKER_PUBLIC_LIBRARY_DIRS}
    ${GLIB2_LIBRARY_DIRS}
    ${GIO2_LIBRARY_DIRS}
    ${YYJSON_LIBRARY_DIRS}
    ${MOSQUITTO_LIBRARY_DIRS}
    $ENV{HOME}/.local/lib64
)
target_link_libraries(mqtt_bridge PUBLIC
    ${GLIB2_LIBRARIES}
    ${GIO2_LIBRARIES}
    ${LB_CORE_LIBRARIES}
    ${LB_BASE_LIBRARIES}
    ${LB_MQTT_BROKER_PUBLIC_LIBRARIES}
    ${YYJSON_LIBRARIES}
    ${MOSQUITTO_LIBRARIES}
)

if (BUILD_TEST)
    add_subdirectory(test_package)
endif()

install(TARGETS ${PROJECT_NAME} DESTINATION opt/litebmc/apps/lb_mqtt/)
install(TARGETS mqtt_bridge DESTINATION opt/litebmc/plugins/)
install(DIRECTORY rootfs/ DESTINATION .)
install(DIRECTORY DESTINATION ${CMAKE_INSTALL_PREFIX}/etc/systemd/system/multi-user.target.wants)
if (BUILD_ENABLE_DBUS_SESSION)
    install(CODE "execute_process(COMMAND ${CMAKE_COMMAND} -E
        create_symlink /usr/lib/systemd/system/${PROJECT_NAME}@.service
        ${CMAKE_INSTALL_PREFIX}/etc/systemd/system/multi-user.target.wants/${PROJECT_NAME}@session.service)")
endif()
if (BUILD_ENABLE_DBUS_SYSTEM)
    install(CODE "execute_process(COMMAND ${CMAKE_COMMAND} -E
        create_symlink /usr/lib/systemd/system/${PROJECT_NAME}@.service
        ${CMAKE_INSTALL_PREFIX}/etc/systemd/system/multi-user.target.wants/${PROJECT_NAME}@system.service)")
endif()
