cmake_minimum_required(VERSION 3.18)

project(houghvg LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
    set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the build type." FORCE)
    set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS Debug Release RelWithDebInfo MinSizeRel)
endif()

if (WIN32 AND NOT DEFINED OpenCV_DIR AND EXISTS "C:/opencv/build/x64/vc16/lib/OpenCVConfig.cmake")
    set(OpenCV_DIR "C:/opencv/build/x64/vc16/lib" CACHE PATH "OpenCV configuration directory")
endif()

find_package(OpenCV REQUIRED)
find_package(OpenMP)

if (CMAKE_VERSION VERSION_LESS 3.18)
    set(PYTHON_DEV_MODULE Development)
else()
    set(PYTHON_DEV_MODULE Development.Module)
endif()

find_package(Python 3.9 COMPONENTS Interpreter ${PYTHON_DEV_MODULE} REQUIRED)

execute_process(
    COMMAND "${Python_EXECUTABLE}" -m nanobind --cmake_dir
    OUTPUT_STRIP_TRAILING_WHITESPACE
    OUTPUT_VARIABLE nanobind_ROOT
)
find_package(nanobind CONFIG REQUIRED)

add_library(houghvg_core STATIC
    HoughVG.cpp
    utils.cpp
)
target_include_directories(houghvg_core PUBLIC
    "${CMAKE_CURRENT_SOURCE_DIR}"
    ${OpenCV_INCLUDE_DIRS}
)
target_link_libraries(houghvg_core PUBLIC ${OpenCV_LIBS})
set_target_properties(houghvg_core PROPERTIES POSITION_INDEPENDENT_CODE ON)

if (OpenMP_CXX_FOUND)
    target_link_libraries(houghvg_core PUBLIC OpenMP::OpenMP_CXX)
endif()

nanobind_add_module(_core NOMINSIZE
    python_bindings.cpp
)
target_link_libraries(_core PRIVATE houghvg_core)

install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/python/houghvg/__init__.py" DESTINATION houghvg)
install(TARGETS _core LIBRARY DESTINATION houghvg RUNTIME DESTINATION houghvg)

option(HOUGHVG_BUILD_DEMO "Build the native OpenCV demo executable" OFF)
if (HOUGHVG_BUILD_DEMO)
    add_executable(houghvg_demo HoughVG_demo.cpp)
    target_link_libraries(houghvg_demo PRIVATE houghvg_core)
endif()
if (WIN32 AND EXISTS "C:/opencv/build/x64/vc16/bin/opencv_world490.dll")
    install(FILES "C:/opencv/build/x64/vc16/bin/opencv_world490.dll" DESTINATION houghvg)
endif()
set(HOUGHVG_WINDOWS_RUNTIME_DLLS
    "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Redist/MSVC/14.44.35112/x64/Microsoft.VC143.CRT/concrt140.dll"
    "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Redist/MSVC/14.44.35112/x64/Microsoft.VC143.CRT/msvcp140.dll"
    "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Redist/MSVC/14.44.35112/x64/Microsoft.VC143.CRT/vcruntime140.dll"
    "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Redist/MSVC/14.44.35112/x64/Microsoft.VC143.CRT/vcruntime140_1.dll"
    "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Redist/MSVC/14.44.35112/x64/Microsoft.VC143.OpenMP/vcomp140.dll"
)

if (WIN32)
    foreach(runtime_dll ${HOUGHVG_WINDOWS_RUNTIME_DLLS})
        if (EXISTS "${runtime_dll}")
            install(FILES "${runtime_dll}" DESTINATION houghvg)
        endif()
    endforeach()
endif()