cmake_minimum_required(VERSION 3.20)
project(JhLabGateway LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# ---- HCNetSDK（仅 MSVC x64 推荐启用）----
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)
  # win-protocol → gateway → web(repo) → code → 项目根/设备对接
  set(_hik_cand
    "${CMAKE_SOURCE_DIR}/../../../../设备对接/HCNetSDKV6.1.10.10_build20250123_Win64_ZH_demosign/HCNetSDKV6.1.10.10_build20250123_Win64_ZH"
  )
  if(EXISTS "${_hik_cand}/incCn/HCNetSDK.h")
    set(JHLAB_HCNETSDK_ROOT "${_hik_cand}" CACHE PATH "HCNetSDK package root" FORCE)
  endif()
endif()

if(MSVC AND JHLAB_HCNETSDK_ROOT AND EXISTS "${JHLAB_HCNETSDK_ROOT}/incCn/HCNetSDK.h"
   AND EXISTS "${JHLAB_HCNETSDK_ROOT}/lib/win64/HCNetSDK.lib")
  set(JHLAB_ENABLE_HCNETSDK ON)
  message(STATUS "HCNetSDK enabled: ${JHLAB_HCNETSDK_ROOT}")
elseif(JHLAB_ENABLE_HCNETSDK)
  message(WARNING "JHLAB_ENABLE_HCNETSDK=ON but SDK not found / not MSVC — building stub")
  set(JHLAB_ENABLE_HCNETSDK OFF)
else()
  message(STATUS "HCNetSDK stub mode (set JHLAB_HCNETSDK_ROOT + MSVC to enable)")
endif()

add_executable(JhLabGateway
  src/main.cpp
  src/hik_acs.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")
  target_link_directories(JhLabGateway PRIVATE "${JHLAB_HCNETSDK_ROOT}/lib/win64")
  target_link_libraries(JhLabGateway PRIVATE HCNetSDK)
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)
