cmake_minimum_required(VERSION 3.16)

project(pydaasiot LANGUAGES CXX)

# Questo branch è esclusivamente Windows.
if(NOT WIN32)
  message(FATAL_ERROR "Questo branch supporta esclusivamente build Windows.")
endif()

# --- Python / pybind11 ------------------------------------------------------
find_package(pybind11 REQUIRED)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)

# Allinea la CRT alla runtime dinamica usata da Python.
if(MSVC)
  set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL")
endif()

# --- Percorsi locali della LibDaaS precompilata per Windows -----------------
# Layout atteso:
#   <DAAS_ROOT>/
#      include/        <-- headers di libdaas
#      lib/daas.lib    <-- import library Windows
#      lib/daas.dll    <-- DLL runtime Windows
set(DAAS_ROOT         "${CMAKE_SOURCE_DIR}" CACHE PATH "Root with include/ and lib/")
set(DAAS_INCLUDE_DIR  "${DAAS_ROOT}/include" CACHE PATH "Path to LibDaaS headers")
set(DAAS_LIBRARY_FILE "${DAAS_ROOT}/lib/daas.lib" CACHE FILEPATH "Path to daas.lib")
set(DAAS_RUNTIME_DLL  "${DAAS_ROOT}/lib/daas.dll" CACHE FILEPATH "Path to daas.dll")

if(NOT EXISTS "${DAAS_INCLUDE_DIR}")
  message(FATAL_ERROR "[LibDaaS] include/ non trovato: ${DAAS_INCLUDE_DIR}")
endif()

if(NOT EXISTS "${DAAS_LIBRARY_FILE}")
  message(FATAL_ERROR "[LibDaaS] daas.lib non trovato: ${DAAS_LIBRARY_FILE}")
endif()

if(NOT EXISTS "${DAAS_RUNTIME_DLL}")
  message(FATAL_ERROR "[LibDaaS] daas.dll non trovato: ${DAAS_RUNTIME_DLL}")
endif()

message(STATUS "[LibDaaS] Include dir : ${DAAS_INCLUDE_DIR}")
message(STATUS "[LibDaaS] Import lib  : ${DAAS_LIBRARY_FILE}")
message(STATUS "[LibDaaS] Runtime DLL : ${DAAS_RUNTIME_DLL}")

# Target IMPORTED per LibDaaS Windows.
# daas.lib è la import library, daas.dll è la DLL caricata a runtime.
add_library(daaslib::prebuilt SHARED IMPORTED GLOBAL)

set_target_properties(daaslib::prebuilt PROPERTIES
  IMPORTED_IMPLIB "${DAAS_LIBRARY_FILE}"
  IMPORTED_LOCATION "${DAAS_RUNTIME_DLL}"
  INTERFACE_INCLUDE_DIRECTORIES "${DAAS_INCLUDE_DIR}"
)

# --- Modulo Python pybind11 -------------------------------------------------
# Il target deve coincidere con il nome del modulo nel C++:
# PYBIND11_MODULE(pydaasiot, m)
pybind11_add_module(pydaasiot
  src/pydaasiot.cpp
  src/daaswrapper.cpp
  src/net_utils.cpp
)

target_include_directories(pydaasiot
  PRIVATE
    "${CMAKE_CURRENT_SOURCE_DIR}/include"
    "${CMAKE_CURRENT_SOURCE_DIR}/third-parties"
)

target_link_libraries(pydaasiot
  PRIVATE
    daaslib::prebuilt
    Iphlpapi
)

set_target_properties(pydaasiot PROPERTIES
  CXX_VISIBILITY_PRESET hidden
  VISIBILITY_INLINES_HIDDEN ON
)

# Copia daas.dll accanto al modulo .pyd nella directory di build.
# Serve per test locali subito dopo la compilazione.
add_custom_command(TARGET pydaasiot POST_BUILD
  COMMAND ${CMAKE_COMMAND} -E copy_if_different
    "${DAAS_RUNTIME_DLL}"
    "$<TARGET_FILE_DIR:pydaasiot>/daas.dll"
  COMMENT "Copying daas.dll next to pydaasiot.pyd"
  VERBATIM
)

# --- Doxygen opzionale ------------------------------------------------------
find_package(Doxygen QUIET)

if(DOXYGEN_FOUND AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile")
  set(DOXYFILE_IN "${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile")
  set(DOXYFILE_OUT "${CMAKE_CURRENT_BINARY_DIR}/Doxyfile")

  configure_file("${DOXYFILE_IN}" "${DOXYFILE_OUT}" @ONLY)

  add_custom_target(doc_doxygen
    COMMAND "${DOXYGEN_EXECUTABLE}" "${DOXYFILE_OUT}"
    WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
    COMMENT "Generating API documentation with Doxygen"
    VERBATIM
  )
else()
  message(STATUS "Doxygen not found or Doxyfile missing; documentation target not generated.")
endif()

# --- Install modulo nel package Python --------------------------------------
# Il wheel finale conterrà:
#
# pydaasiot/
#   __init__.py
#   pydaasiot.cp312-win_amd64.pyd
#   daas.dll
#
install(
  TARGETS pydaasiot
  LIBRARY DESTINATION pydaasiot
  RUNTIME DESTINATION pydaasiot
)

install(
  FILES "${DAAS_RUNTIME_DLL}"
  DESTINATION pydaasiot
)