cmake_minimum_required(VERSION 3.5)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_C_STANDARD 20)
set(CMAKE_C_STANDARD_REQUIRED ON)

set(BLUEZ_LIB uav-bluez)

if(NOT UAV_INCLUDE_LIBS)
    if(NOT DEFINED PROJECT_VERSION)
        set(PROJECT_VERSION 1.0.0)
    endif()

    project(${BLUEZ_LIB} VERSION ${PROJECT_VERSION} DESCRIPTION "${BLUEZ_LIB} library")
endif()

set(BLUEZ_HEADERS
    bluez-interface.h
)

set(BLUEZ_SB_HEADERS
    simpleble/simplebluez/ProxyOrg.h
    simpleble/simplebluez/Logging.h
    simpleble/simplebluez/Agent.h
    simpleble/simplebluez/Device.h
    simpleble/simplebluez/Characteristic.h
    simpleble/simplebluez/Exceptions.h
    simpleble/simplebluez/ProxyOrgBluez.h
    simpleble/simplebluez/Service.h
    simpleble/simplebluez/Adapter.h
    simpleble/simplebluez/Bluez.h
    simpleble/simplebluez/Descriptor.h
    simpleble/simplebluez/Types.h
)

set(BLUEZ_SB_IFACE_HEADERS
    simpleble/simplebluez/interfaces/Adapter1.h
    simpleble/simplebluez/interfaces/Agent1.h
    simpleble/simplebluez/interfaces/GattDescriptor1.h
    simpleble/simplebluez/interfaces/GattCharacteristic1.h
    simpleble/simplebluez/interfaces/GattService1.h
    simpleble/simplebluez/interfaces/Device1.h
    simpleble/simplebluez/interfaces/Battery1.h
    simpleble/simplebluez/interfaces/AgentManager1.h
)

set(BLUEZ_SDB_ADV_HEADERS
    simpleble/simpledbus/advanced/Interface.h
    simpleble/simpledbus/advanced/Proxy.h
)

set(BLUEZ_SDB_BASE_HEADERS
    simpleble/simpledbus/base/Connection.h
    simpleble/simpledbus/base/Exceptions.h
    simpleble/simpledbus/base/Holder.h
    simpleble/simpledbus/base/Logging.h
    simpleble/simpledbus/base/Message.h
    simpleble/simpledbus/base/Path.h
)

set(BLUEZ_SDB_IFACE_HEADERS
    simpleble/simpledbus/interfaces/ObjectManager.h
)

set(BLUEZ_SDB_EXT_HEADERS
    simpleble/simpledbus/external/kvn_safe_callback.hpp
    simpleble/simpledbus/external/logfwd.hpp
)

set(BLUEZ_SOURCES
    bluez-interface.cpp
    simpleble/simplebluez/ProxyOrg.cpp
    simpleble/simplebluez/Logging.cpp
    simpleble/simplebluez/Agent.cpp
    simpleble/simplebluez/Device.cpp
    simpleble/simplebluez/Characteristic.cpp
    simpleble/simplebluez/Exceptions.cpp
    simpleble/simplebluez/ProxyOrgBluez.cpp
    simpleble/simplebluez/Service.cpp
    simpleble/simplebluez/Adapter.cpp
    simpleble/simplebluez/Bluez.cpp
    simpleble/simplebluez/Descriptor.cpp
    simpleble/simplebluez/interfaces/Adapter1.cpp
    simpleble/simplebluez/interfaces/Agent1.cpp
    simpleble/simplebluez/interfaces/GattDescriptor1.cpp
    simpleble/simplebluez/interfaces/GattCharacteristic1.cpp
    simpleble/simplebluez/interfaces/GattService1.cpp
    simpleble/simplebluez/interfaces/Device1.cpp
    simpleble/simplebluez/interfaces/Battery1.cpp
    simpleble/simplebluez/interfaces/AgentManager1.cpp
    simpleble/simpledbus/advanced/Interface.cpp
    simpleble/simpledbus/advanced/Proxy.cpp
    simpleble/simpledbus/base/Connection.cpp
    simpleble/simpledbus/base/Exceptions.cpp
    simpleble/simpledbus/base/Holder.cpp
    simpleble/simpledbus/base/Logging.cpp
    simpleble/simpledbus/base/Message.cpp
    simpleble/simpledbus/base/Path.cpp
    simpleble/simpledbus/interfaces/ObjectManager.cpp
)

add_library(${BLUEZ_LIB} SHARED
    ${BLUEZ_HEADERS}
    ${BLUEZ_SB_HEADERS}
    ${BLUEZ_SB_IFACE_HEADERS}
    ${BLUEZ_SDB_ADV_HEADERS}
    ${BLUEZ_SDB_BASE_HEADERS}
    ${BLUEZ_SDB_IFACE_HEADERS}
    ${BLUEZ_SDB_EXT_HEADERS}

    ${BLUEZ_SOURCES}
)

find_package (Qt5 COMPONENTS DBus REQUIRED)
find_package(DBus1 REQUIRED)

if(UAV_LIB_BLUEZ)
    add_dependencies(${BLUEZ_LIB} uavconfdetpojo)
endif()

if(${CMAKE_CXX_COMPILER} MATCHES "clang")
    target_link_options(${BLUEZ_LIB} PUBLIC "-std=c++20" "-stdlib=libc++")
    target_compile_options(${BLUEZ_LIB} PUBLIC "-std=c++20" "-stdlib=libc++")
endif()

target_link_libraries(${BLUEZ_LIB} PUBLIC
  $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/../libuavconfdetpojo.so>
  $<INSTALL_INTERFACE:uavconfdetpojo>
    Qt5::DBus
    ${DBus1_LIBRARIES}
)

target_include_directories(${BLUEZ_LIB} PRIVATE
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../>
  $<INSTALL_INTERFACE:.>
)

if(DEFINED CPACK_ARCHITECTURE_PATH)
  install(TARGETS ${BLUEZ_LIB}
      LIBRARY DESTINATION /usr/lib/${CPACK_ARCHITECTURE_PATH}
  )
  set(INCLUDE_DIR /usr/include/${CPACK_ARCHITECTURE_PATH})
else()
  install(TARGETS ${BLUEZ_LIB}
      LIBRARY DESTINATION /usr/lib
  )
  set(INCLUDE_DIR /usr/include)
endif()

foreach(_file IN LISTS BLUEZ_HEADERS)
    install(FILES ${_file} DESTINATION ${INCLUDE_DIR}/${BLUEZ_LIB}/)
endforeach()
foreach(_file IN LISTS BLUEZ_SB_HEADERS)
    install(FILES ${_file} DESTINATION ${INCLUDE_DIR}/${BLUEZ_LIB}/simpleble/simplebluez/)
endforeach()
foreach(_file IN LISTS BLUEZ_SB_IFACE_HEADERS)
    install(FILES ${_file} DESTINATION ${INCLUDE_DIR}/${BLUEZ_LIB}/simpleble/simplebluez/interfaces/)
endforeach()
foreach(_file IN LISTS BLUEZ_SDB_ADV_HEADERS)
    install(FILES ${_file} DESTINATION ${INCLUDE_DIR}/${BLUEZ_LIB}/simpleble/simpledbus/advanced/)
endforeach()
foreach(_file IN LISTS BLUEZ_SDB_BASE_HEADERS)
    install(FILES ${_file} DESTINATION ${INCLUDE_DIR}/${BLUEZ_LIB}/simpleble/simpledbus/base/)
endforeach()
foreach(_file IN LISTS BLUEZ_SDB_IFACE_HEADERS)
    install(FILES ${_file} DESTINATION ${INCLUDE_DIR}/${BLUEZ_LIB}/simpleble/simpledbus/interfaces/)
endforeach()
foreach(_file IN LISTS BLUEZ_SDB_EXT_HEADERS)
    install(FILES ${_file} DESTINATION ${INCLUDE_DIR}/${BLUEZ_LIB}/simpleble/simpledbus/external/)
endforeach()

if(NOT UAV_INCLUDE_LIBS)
  if(DEFINED CPACK_DEBIAN_PACKAGE_ARCHITECTURE)
    set(CPACK_PACKAGE_FILE_NAME "lib${BLUEZ_LIB}-${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}-${PROJECT_VERSION}-Linux")
  else()
  set(CPACK_PACKAGE_FILE_NAME "lib${BLUEZ_LIB}-${PROJECT_VERSION}-Linux")
  endif()

  set(CPACK_PACKAGE_VENDOR "4code")
  set(CPACK_PACKAGE_CONTACT "info@4code.ru")

  set(CPACK_ARCHIVE_COMPONENT_INSTALL On)
  set(CPACK_DEB_COMPONENT_INSTALL On)

  set(CPACK_PACKAGING_INSTALL_PREFIX "/usr")

  set(CPACK_DEBIAN_PACKAGE_DEPENDS "uavconfdetpojo (= ${PROJECT_VERSION})")

  include(CPack)
endif()
