cmake_minimum_required(VERSION 3.20)
project(JhLabGateway LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# ---- HCNetSDK：MSVC 链 .lib；MinGW 可用 gendef/dlltool 生成的 .a ----
option(JHLAB_ENABLE_HCNETSDK "Link Hikvision HCNetSDK" OFF)
set(JHLAB_HCNETSDK_ROOT "" CACHE PATH "HCNetSDK package root (contains incCn/ and lib/win64/)")

if(NOT JHLAB_HCNETSDK_ROOT)
  foreach(_hik_cand
      "${CMAKE_SOURCE_DIR}/../../../../设备对接/HCNetSDKV6.1.10.10_build20250123_Win64_ZH_demosign/HCNetSDKV6.1.10.10_build20250123_Win64_ZH"
      "D:/build/sdk"
      "${CMAKE_SOURCE_DIR}/../sdk"
    )
    if(EXISTS "${_hik_cand}/incCn/HCNetSDK.h")
      set(JHLAB_HCNETSDK_ROOT "${_hik_cand}" CACHE PATH "HCNetSDK package root" FORCE)
      break()
    endif()
  endforeach()
endif()

set(_hik_have_headers FALSE)
set(_hik_have_msvc_lib FALSE)
set(_hik_have_dll FALSE)
if(JHLAB_HCNETSDK_ROOT AND EXISTS "${JHLAB_HCNETSDK_ROOT}/incCn/HCNetSDK.h")
  set(_hik_have_headers TRUE)
endif()
if(JHLAB_HCNETSDK_ROOT AND EXISTS "${JHLAB_HCNETSDK_ROOT}/lib/win64/HCNetSDK.lib")
  set(_hik_have_msvc_lib TRUE)
endif()
if(JHLAB_HCNETSDK_ROOT AND EXISTS "${JHLAB_HCNETSDK_ROOT}/lib/win64/HCNetSDK.dll")
  set(_hik_have_dll TRUE)
endif()

if(MSVC AND _hik_have_headers AND _hik_have_msvc_lib)
  set(JHLAB_ENABLE_HCNETSDK ON)
  message(STATUS "HCNetSDK enabled (MSVC): ${JHLAB_HCNETSDK_ROOT}")
elseif(MINGW AND _hik_have_headers AND _hik_have_dll)
  set(JHLAB_ENABLE_HCNETSDK ON)
  message(STATUS "HCNetSDK enabled (MinGW import lib): ${JHLAB_HCNETSDK_ROOT}")
elseif(JHLAB_ENABLE_HCNETSDK)
  message(WARNING "JHLAB_ENABLE_HCNETSDK=ON but SDK headers/libs missing — building stub")
  set(JHLAB_ENABLE_HCNETSDK OFF)
else()
  message(STATUS "HCNetSDK stub mode (provide JHLAB_HCNETSDK_ROOT + MSVC/.lib or MinGW/DLL)")
endif()

add_executable(JhLabGateway
  src/main.cpp
  src/hik_acs.cpp
  src/hik_cam.cpp
)
target_include_directories(JhLabGateway PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/third_party)

if(JHLAB_ENABLE_HCNETSDK)
  target_compile_definitions(JhLabGateway PRIVATE JHLAB_HAS_HCNETSDK)
  target_include_directories(JhLabGateway PRIVATE "${JHLAB_HCNETSDK_ROOT}/incCn")
  if(MSVC)
    target_link_directories(JhLabGateway PRIVATE "${JHLAB_HCNETSDK_ROOT}/lib/win64")
    target_link_libraries(JhLabGateway PRIVATE HCNetSDK)
  elseif(MINGW)
    set(_hik_implib_dir "${CMAKE_BINARY_DIR}/hcnet_implib")
    file(MAKE_DIRECTORY "${_hik_implib_dir}")
    set(_hik_dll "${JHLAB_HCNETSDK_ROOT}/lib/win64/HCNetSDK.dll")
    set(_hik_def "${_hik_implib_dir}/HCNetSDK.def")
    set(_hik_a "${_hik_implib_dir}/libHCNetSDK.a")
    find_program(GENDEF_EXE gendef REQUIRED)
    find_program(DLLTOOL_EXE dlltool REQUIRED)
    add_custom_command(
      OUTPUT "${_hik_a}"
      COMMAND "${GENDEF_EXE}" - "${_hik_dll}" > "${_hik_def}"
      COMMAND "${DLLTOOL_EXE}" -d "${_hik_def}" -l "${_hik_a}" -D HCNetSDK.dll
      DEPENDS "${_hik_dll}"
      COMMENT "Generating MinGW import library for HCNetSDK.dll"
      VERBATIM
    )
    add_custom_target(hcnet_implib DEPENDS "${_hik_a}")
    add_dependencies(JhLabGateway hcnet_implib)
    target_link_libraries(JhLabGateway PRIVATE "${_hik_a}")
  endif()
endif()

if(WIN32)
  target_compile_definitions(JhLabGateway PRIVATE _CRT_SECURE_NO_WARNINGS WIN32_LEAN_AND_MEAN)
  target_link_libraries(JhLabGateway PRIVATE ws2_32)
endif()
if(MSVC)
  target_compile_options(JhLabGateway PRIVATE /W3 /utf-8)
elseif(MINGW)
  target_compile_options(JhLabGateway PRIVATE -Wall -O2)
endif()

# Copy runtime assets next to the binary
add_custom_command(TARGET JhLabGateway POST_BUILD
  COMMAND ${CMAKE_COMMAND} -E copy_if_different
          ${CMAKE_SOURCE_DIR}/config.json $<TARGET_FILE_DIR:JhLabGateway>/config.json
  COMMAND ${CMAKE_COMMAND} -E copy_directory
          ${CMAKE_SOURCE_DIR}/web $<TARGET_FILE_DIR:JhLabGateway>/web
)

if(JHLAB_ENABLE_HCNETSDK)
  # 运行目录需要 HCNetSDK.dll / HCCore.dll 及 HCNetSDKCom/*
  add_custom_command(TARGET JhLabGateway POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_if_different
            "${JHLAB_HCNETSDK_ROOT}/lib/win64/HCNetSDK.dll"
            $<TARGET_FILE_DIR:JhLabGateway>/HCNetSDK.dll
    COMMAND ${CMAKE_COMMAND} -E copy_if_different
            "${JHLAB_HCNETSDK_ROOT}/lib/win64/HCCore.dll"
            $<TARGET_FILE_DIR:JhLabGateway>/HCCore.dll
    COMMAND ${CMAKE_COMMAND} -E copy_directory
            "${JHLAB_HCNETSDK_ROOT}/lib/win64/HCNetSDKCom"
            $<TARGET_FILE_DIR:JhLabGateway>/HCNetSDKCom
  )
endif()

install(TARGETS JhLabGateway RUNTIME DESTINATION bin)
install(FILES config.json DESTINATION bin)
install(DIRECTORY web/ DESTINATION bin/web)
