### SET CMAKE POLICIES ###
cmake_minimum_required(VERSION 3.10...3.17)

if(${CMAKE_VERSION} VERSION_LESS 3.12)
    cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
endif()

if (NOT CMAKE_CXX_STANDARD)
  set(CMAKE_CXX_STANDARD 17)
endif()

if(${CMAKE_VERSION} VERSION_EQUAL "3.11.0" OR ${CMAKE_VERSION} VERSION_GREATER "3.11.0")
  cmake_policy(SET CMP0072 NEW)
endif()

if (CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_ID MATCHES "Clang")
  add_compile_options(-Wall -Wextra -Wpedantic)
endif()
### END CMAKE POLICIES ###

project(multires_image
  LANGUAGES CXX)

find_package(ament_cmake REQUIRED)
find_package(mapviz REQUIRED)
find_package(pluginlib REQUIRED)
find_package(Qt5Core REQUIRED)
find_package(Qt5Gui REQUIRED)
find_package(Qt5OpenGL REQUIRED)
find_package(Qt5Widgets REQUIRED)
find_package(rclcpp  REQUIRED)
find_package(tf2 REQUIRED)
find_package(swri_transform_util  REQUIRED)
find_package(swri_math_util REQUIRED)

### OpenCV ###
add_definitions(-DWFlags=WindowFlags)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

# Build libtile_cache
set(TILE_SRC_FILES 
   src/tile.cpp
   src/tile_cache.cpp
   src/tile_set.cpp
   src/tile_set_layer.cpp)

qt5_wrap_cpp(TILE_SRC_FILES include/${PROJECT_NAME}/tile_cache.h)

add_library(${PROJECT_NAME} 
  ${TILE_SRC_FILES})

target_include_directories(${PROJECT_NAME}
  PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
    $<INSTALL_INTERFACE:include/${PROJECT_NAME}>
)

target_link_libraries(${PROJECT_NAME} PUBLIC
  ${mapviz_TARGETS}
  pluginlib::pluginlib
  Qt5::Core
  Qt5::Gui
  Qt5::OpenGL
  Qt5::Widgets
  rclcpp::rclcpp
  ${swri_math_util_TARGETS}
  ${swri_transform_util_TARGETS}
  tf2::tf2
)

# Build libmultires_widget
set(UI_FILES
  src/QGLMap.ui
  src/multires_config.ui
)
set(WIDGET_SRC_FILES src/tile_view.cpp src/QGLMap.cpp)

qt5_wrap_ui(WIDGET_SRC_FILES ${UI_FILES})
qt5_wrap_cpp(WIDGET_SRC_FILES include/${PROJECT_NAME}/QGLMap.h)

add_library(multires_widget
  ${WIDGET_SRC_FILES}
)
target_link_libraries(multires_widget
  ${PROJECT_NAME}
  Qt5::Core
  Qt5::Gui
  Qt5::OpenGL
  Qt5::Widgets
)

# Build nodes
set(VIEW_NODE_SRC_FILES src/nodes/multires_view_node.cpp)
qt5_wrap_cpp(VIEW_NODE_SRC_FILES include/${PROJECT_NAME}/multires_view_node.h)
add_executable(multires_view_node ${VIEW_NODE_SRC_FILES})
target_link_libraries(multires_view_node PUBLIC
  multires_widget
  rclcpp::rclcpp
)

# Build mapviz plugin
set(MAPVIZ_SRC_FILES 
  src/${PROJECT_NAME}_plugin.cpp
  src/multires_view.cpp)
qt5_wrap_ui(MAPVIZ_SRC_FILES src/multires_config.ui)
qt5_wrap_cpp(MAPVIZ_SRC_FILES include/${PROJECT_NAME}/${PROJECT_NAME}_plugin.h)

add_library(${PROJECT_NAME}_plugin SHARED
  ${MAPVIZ_SRC_FILES}
)

target_link_libraries(${PROJECT_NAME}_plugin PUBLIC
  ${PROJECT_NAME}
  multires_widget
  ${mapviz_TARGETS}
)

### Install ${PROJECT_NAME} plugin ###
install(DIRECTORY include/
  DESTINATION include/${PROJECT_NAME}
  FILES_MATCHING PATTERN "*.h"
)

# Install executables/nodes
install(TARGETS multires_view_node
  DESTINATION lib/${PROJECT_NAME}
)

# Install and export libraries
install(TARGETS ${PROJECT_NAME}
  multires_widget
  ${PROJECT_NAME}_plugin
  EXPORT export_${PROJECT_NAME}
  RUNTIME DESTINATION bin
  LIBRARY DESTINATION lib
  ARCHIVE DESTINATION lib
)

install(PROGRAMS nodes/mapviz_tile_loader
  DESTINATION lib/${PROJECT_NAME}
)

install(DIRECTORY launch
  DESTINATION share/${PROJECT_NAME}
  FILES_MATCHING PATTERN ".py" PATTERN ".launch"
)

pluginlib_export_plugin_description_file(mapviz mapviz_plugins.xml)

ament_export_targets(export_${PROJECT_NAME} HAS_LIBRARY_TARGET)
ament_export_dependencies(Qt5Core
  Qt5Gui
  Qt5OpenGL
  Qt5Widgets
)
ament_export_include_directories(
  include/${PROJECT_NAME}
)
ament_export_libraries(
  ${PROJECT_NAME}
)
ament_package()
