#--------------------------------------------------------
# The CMakeLists.txt for:                       pPowerMangerHost
# Description: 模拟 pPowerManger 上位机（发指令 / 监控），
#              通过 mongoose HTTP+WebSocket 提供网页交互。
#              复用 src/pPowerManger/httpserver/mongoose.c，
#              不新增任何第三方依赖。
#--------------------------------------------------------

SET(MONGOOSE_SRC
  ${CMAKE_SOURCE_DIR}/src/pPowerManger/httpserver/mongoose.c)

SET(SRC
  HostSim.cpp
  HostSim_Info.cpp
  WebServer.cpp
  main.cpp
  ${MONGOOSE_SRC}
)

#--------------------------------------------------------
# web/ 目录 -> webassets_gen.h : 通用嵌入式资源表
# 扫描 web/ 下所有文件，逐个读成字节数组，并生成 {路径, MIME, 数据} 注册表。
# 新增页面/资源只需放入 web/ 目录，CMake 自动重新生成（含重新 configure）。
#--------------------------------------------------------
SET(WEB_ASSET_DIR ${CMAKE_CURRENT_SOURCE_DIR}/web)
SET(WEB_ASSET_HDR ${CMAKE_CURRENT_BINARY_DIR}/webassets_gen.h)

FILE(GLOB WEB_ASSET_FILES ${WEB_ASSET_DIR}/*)
LIST(SORT WEB_ASSET_FILES)
LIST(LENGTH WEB_ASSET_FILES WEB_ASSET_COUNT)
IF(NOT WEB_ASSET_FILES)
  MESSAGE(FATAL_ERROR "web/ 目录为空，请至少放入一个页面资源")
ENDIF()

# 目录内文件增删/修改时自动重新 configure
SET_PROPERTY(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS
  ${WEB_ASSET_DIR} ${WEB_ASSET_FILES})

SET(WEB_ASSET_HEADER
"// Auto-generated from web/, DO NOT EDIT
#ifndef WEBASSETS_GEN_H
#define WEBASSETS_GEN_H

#include <string.h>

namespace webassets {

struct Asset {
    const char* path;
    const char* mime;
    const unsigned char* data;
    unsigned long len;
};

")

SET(WEB_ASSET_ARRAYS "")
SET(WEB_ASSET_REGISTRY "")

FOREACH(f ${WEB_ASSET_FILES})
  GET_FILENAME_COMPONENT(name ${f} NAME)
  STRING(MAKE_C_IDENTIFIER ${name} arrname)

  # 读成十六进制字节序列，再转成 C 数组初始化
  FILE(READ ${f} hexdata HEX)
  STRING(REGEX REPLACE "([0-9a-f][0-9a-f])" "0x\\1," hexdata "${hexdata}")

  # 按扩展名推断 MIME（if/elseif 体内命令须另起一行）
  SET(mime "application/octet-stream")
  IF(name MATCHES "\\.(html|htm)$")
    SET(mime "text/html; charset=utf-8")
  ELSEIF(name MATCHES "\\.css$")
    SET(mime "text/css")
  ELSEIF(name MATCHES "\\.js$")
    SET(mime "application/javascript")
  ELSEIF(name MATCHES "\\.json$")
    SET(mime "application/json")
  ELSEIF(name MATCHES "\\.png$")
    SET(mime "image/png")
  ELSEIF(name MATCHES "\\.(jpe?g)$")
    SET(mime "image/jpeg")
  ELSEIF(name MATCHES "\\.gif$")
    SET(mime "image/gif")
  ELSEIF(name MATCHES "\\.svg$")
    SET(mime "image/svg+xml")
  ELSEIF(name MATCHES "\\.(woff2?)$")
    SET(mime "font/woff2")
  ELSEIF(name MATCHES "\\.txt$")
    SET(mime "text/plain")
  ENDIF()

  STRING(APPEND WEB_ASSET_ARRAYS
    "static const unsigned char ${arrname}[] = { ${hexdata} };\n\n")
  STRING(APPEND WEB_ASSET_REGISTRY
    "    { \"${name}\", \"${mime}\", ${arrname}, sizeof(${arrname}) },\n")
ENDFOREACH()

FILE(WRITE ${WEB_ASSET_HDR}
"${WEB_ASSET_HEADER}${WEB_ASSET_ARRAYS}static const Asset REGISTRY[] = {\n${WEB_ASSET_REGISTRY}};\n\ninline const Asset* find(const char* path) {\n    const unsigned long n = sizeof(REGISTRY) / sizeof(REGISTRY[0]);\n    for (unsigned long i = 0; i < n; ++i) {\n        if (strcmp(REGISTRY[i].path, path) == 0) return &REGISTRY[i];\n    }\n    return NULL;\n}\n\n}\n#endif\n")

MESSAGE(STATUS "Generated ${WEB_ASSET_HDR} (${WEB_ASSET_COUNT} files) from ${WEB_ASSET_DIR}")


ADD_EXECUTABLE(pPowerMangerHost ${SRC})

TARGET_INCLUDE_DIRECTORIES(pPowerMangerHost PRIVATE
  ${CMAKE_SOURCE_DIR}/src/pPowerManger/httpserver
  ${CMAKE_CURRENT_BINARY_DIR})

TARGET_LINK_LIBRARIES(pPowerMangerHost
   ${MOOS_LIBRARIES}
   mbutil
   m
   pthread
   jsoncpp)
