cmake_minimum_required(VERSION 3.15)

if(DEFINED pybind11_ROOT AND pybind11_ROOT STREQUAL "AUTO_DETECT")
    execute_process(
        COMMAND "python" -m pybind11 --cmakedir
        RESULT_VARIABLE _pybind11_rc
        OUTPUT_VARIABLE _pybind11_cmake_dir
        OUTPUT_STRIP_TRAILING_WHITESPACE
    )

    if(_pybind11_rc EQUAL 0 AND IS_DIRECTORY "${_pybind11_cmake_dir}")
        set(pybind11_ROOT "${_pybind11_cmake_dir}"
            CACHE PATH "pybind11 root (auto-detected from 'python -m pybind11 --cmakedir')" FORCE)
    else()
        message(FATAL_ERROR
            "AUTO_DETECT for pybind11_ROOT failed: "
            "return code=${_pybind11_rc}, stdout='${_pybind11_cmake_dir}'. "
            "Set pybind11_ROOT manually.")
    endif()
endif()

if(WIN32)
    if(NOT DEFINED CMAKE_TOOLCHAIN_FILE)
        if(DEFINED ENV{VCPKG_ROOT})
            set(CMAKE_TOOLCHAIN_FILE "$ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake" CACHE FILEPATH "" FORCE)
        endif()
    endif()
endif()

project(wujihandpy)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

set(BUILD_STATIC_WUJIHANDCPP ON CACHE BOOL "" FORCE)
# Wheel build: wujihandcpp is embedded into _core.so; do not also install it
# (or its bundled spdlog) into the wheel.
set(WUJIHANDCPP_INSTALL OFF CACHE BOOL "" FORCE)
set(SPDLOG_INSTALL OFF CACHE BOOL "" FORCE)
add_subdirectory(wujihandcpp EXCLUDE_FROM_ALL)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED True)
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED True)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_C_EXTENSIONS OFF)

if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE Release)
endif()

# Add compiler options based on compiler
if(MSVC)
    add_compile_options(/W4 /Zc:preprocessor /EHsc)
    add_compile_definitions(NOMINMAX _CRT_SECURE_NO_WARNINGS)
    set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL")
else()
    # GCC/Clang
    add_compile_options(-Wall -Wextra -Wpedantic)
endif()

# Get project sources
file(GLOB_RECURSE PROJECT_SOURCE CONFIGURE_DEPENDS
    ${PROJECT_SOURCE_DIR}/src/*.cpp
    ${PROJECT_SOURCE_DIR}/src/*.c
)


set(PYBIND11_FINDPYTHON ON)
find_package(pybind11 CONFIG REQUIRED)

pybind11_add_module(_core ${PROJECT_SOURCE})

target_include_directories(_core PRIVATE ${PROJECT_SOURCE_DIR}/wujihandcpp/include)
target_include_directories(_core PRIVATE ${PROJECT_SOURCE_DIR}/src)

target_link_libraries(_core PRIVATE pybind11::module)

target_link_directories(_core PRIVATE ${CMAKE_BINARY_DIR}/wujihandcpp)
target_link_libraries(_core PRIVATE wujihandcpp)

# Keep this gate aligned with the Linux-only tactile headers and transport sources.
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
    target_compile_definitions(_core PRIVATE WUJIHANDPY_ENABLE_TACTILE)
endif()

# The install directory is the output (wheel) directory
install(TARGETS _core DESTINATION wujihandpy)
