# 声明最低版本 (与你的 CMakePresets.json 保持一致)
cmake_minimum_required(VERSION 3.21)

# CMP0091 策略最好放在最前面，确保全局生效
cmake_policy(SET CMP0091 NEW)

# 强制指定 Windows SDK 版本为 Win11 SDK 
set(CMAKE_SYSTEM_VERSION "${WIN11_SDK}" CACHE STRING "Specify Windows SDK version" FORCE)

# 定义工程大本营
project(CADProject VERSION 1.0.0 LANGUAGES CXX)

# 开启全局解决方案文件夹支持
set_property(GLOBAL PROPERTY USE_FOLDERS ON)

# 全局设定：强制所有配置使用 Release 版本的 CRT 运行库 (/MD)
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreadedDLL")

# 将我们自定义的 cmake 文件夹加入模块搜索路径
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
include(functions)

IsZWCAD(IS_ZWCAD)
# 如果时中望,取出版本号的后两位,作为宏定义
get_sdk_version(SDK_VERSION)

# ThirdPartyDeps里面使用了SDK_VERSION
include(ThirdPartyDeps)
    

# 对 CMake 生成的默认 
if(MSVC)
    # 剔除 所有工程内的 _DEBUG 宏, 判断是否是 debug/release 模式时,使用 NDEBUG 来判断
    string(REGEX REPLACE "[/-]D_DEBUG" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
    string(REGEX REPLACE "[/-]D_DEBUG" "" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")
    # 剔除 /RTC 相关的运行时检查参数 (如 /RTC1, /RTCs, /RTCu)
    # 这一步是消除 __MSVC_RUNTIME_CHECKS 宏的关键
    string(REGEX REPLACE "[/-]RTC[a-zA-Z0-9]+" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
    string(REGEX REPLACE "[/-]RTC[a-zA-Z0-9]+" "" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")
endif()

if (IS_ZWCAD)
    if (CAD_SDK_VERSION GREATER 2021)
        message(STATUS ">>> 检测到现代 ZRX SDK (${CAD_SDK_VERSION})，自动提权至 C++14 标准")
        set(CMAKE_CXX_STANDARD 14)
    endif()
else()
    if(CAD_SDK_VERSION GREATER 25)
        message(STATUS ">>> 检测到现代 ARX SDK (${CAD_SDK_VERSION})，自动提权至 C++20 标准")
        set(CMAKE_CXX_STANDARD 20)
    elseif (CAD_SDK_VERSION GREATER_EQUAL 20)
        message(STATUS ">>> 检测到现代 ARX SDK (${CAD_SDK_VERSION})，自动提权至 C++14 标准")
        set(CMAKE_CXX_STANDARD 14)
    elseif (CAD_SDK_VERSION GREATER 19)
        message(STATUS ">>> 检测到现代 ARX SDK (${CAD_SDK_VERSION})，自动提权至 C++03 标准")
        set(CMAKE_CXX_STANDARD 03)
    else()
        message(STATUS ">>> 检测到传统 ARX SDK (${CAD_SDK_VERSION})，保持 C++98 标准")
        set(CMAKE_CXX_STANDARD 98)
    endif()
endif()

set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 检查presets中是否定义了必要的变量
# 把所有必须存在的变量名写成一个列表 (完美支持换行)
set(REQUIRED_VARS
    CAD_SDK_ROOT
    DEP_LIB_ROOT
    DEP_INC_ROOT
    CAD_SDK_VERSION)

if (NOT IS_ZWCAD)
    list(APPEND REQUIRED_VARS CAD_SDK_SUBVERSION)
endif()

# 2. 遍历这个列表进行检查
foreach(VAR_NAME IN LISTS REQUIRED_VARS)
    # 注意这里使用了 ${VAR_NAME}，它会展开成上面的字符串，如 "CAD_SDK_VERSION"
    if(NOT DEFINED ${VAR_NAME})
        message(FATAL_ERROR "【严重错误】缺少必要的配置变量: ${VAR_NAME}！请在 CMakePresets.json 中提供。")
    endif()
endforeach()

# 以下为所有工程都加入相应的宏
if(MSVC)
    # 🌟 开启 MSVC 多核并发编译！巨型工程提速的终极神器
    add_compile_options(/MP)

    # 🌟 统一设置全局 Unicode 宏 (ARX 和 MFC 都强烈需要)
    add_compile_definitions(
        UNICODE
        _UNICODE
        # release 模式下，统一设置 NDEBUG 宏
        $<$<CONFIG:Release>:NDEBUG>
		# 关闭安全警告
		_CRT_SECURE_NO_WARNINGS
        )

    # 判断一下是不是中望cad
    if (IS_ZWCAD)
        message(STATUS ">>> 编译中望CAD版本")
        # 加入 ZWCAD 宏,为代码标记中望版本
        add_compile_definitions(ZWCAD)
    endif()

    # 使用for 循环内声明的变量作用域
    add_compile_options(/Zc:forScope-)
    # 可选：关闭 MSVC 烦人的极度严格警告 (根据你的团队习惯开启/关闭)
    add_compile_options(/wd4819 /wd4996) 
endif()

# ==========================================
# 第二部分：全局输出目录重定向 (精准路由)
# ==========================================

# 用 CMake 内置命令把带 ../ 的路径“洗”成干净的绝对路径
get_filename_component(GLOBAL_BIN_DIR "${GENERATE_BIN_DIR}" ABSOLUTE)
get_filename_component(GLOBAL_LIB_DIR "${GENERATE_LIB_DIR}" ABSOLUTE)

# 生成形如 "R243", "R200" 的后缀,中望版本"Z2023","Z2024"

if (IS_ZWCAD)
    set(GENERATE_DIR_TAG "Z${CAD_SDK_VERSION}")
else()
    set(GENERATE_DIR_TAG "R${CAD_SDK_VERSION}${CAD_SDK_SUBVERSION}")
endif()
message(STATUS ">>> 当前输出版本标签: ${GENERATE_DIR_TAG}")

# 配置输出目录
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG "${GLOBAL_BIN_DIR}/Debug-${GENERATE_DIR_TAG}")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE "${GLOBAL_BIN_DIR}/Release-${GENERATE_DIR_TAG}")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG "${GLOBAL_LIB_DIR}/Debug-${GENERATE_DIR_TAG}")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE "${GLOBAL_LIB_DIR}/Release-${GENERATE_DIR_TAG}")

message(STATUS ">>> 正在构建业务树...")

add_subdirectory(./src/AutoAgent)

