cmake_minimum_required(VERSION 3.10)
project(LidarMagicSDK VERSION 1.2.0 LANGUAGES CXX C)

# ==================== 编译选项 ====================
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)

# 构建选项
option(BUILD_SHARED_LIBS "Build shared library" ON)
option(BUILD_STATIC_LIBS "Build static library" ON)
option(BUILD_EXAMPLES "Build example programs" ON)
option(BUILD_TESTS "Build test programs" ON)
option(BUILD_C_EXAMPLE "Build C language example" ON)

# ==================== 头文件 ====================
set(SDK_HEADERS
    lidar_magic_sdk.h
    lidar_magic_protocol.h
    lidar_magic_version.h
    lidar_magic_export.h
    lidar_magic_c_api.h
)

# ==================== 源文件 ====================
set(SDK_SOURCES
    lidar_magic_sdk.cpp
    lidar_magic_c_api.cpp
)

# ==================== 平台检测 ====================
if(WIN32)
    set(PLATFORM_LIBS ws2_32 iphlpapi)
    add_definitions(-D_WIN32_WINNT=0x0601)
    add_definitions(-DWIN32_LEAN_AND_MEAN)
elseif(UNIX)
    set(PLATFORM_LIBS pthread)
endif()

# ==================== 静态库 ====================
if(BUILD_STATIC_LIBS)
    add_library(lidar_magic_sdk_static STATIC ${SDK_SOURCES})
    target_include_directories(lidar_magic_sdk_static PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
        $<INSTALL_INTERFACE:include/lidar_magic>
    )
    target_compile_definitions(lidar_magic_sdk_static PUBLIC LIDAR_MAGIC_SDK_STATIC)
    target_link_libraries(lidar_magic_sdk_static PUBLIC ${PLATFORM_LIBS})
    
    set_target_properties(lidar_magic_sdk_static PROPERTIES
        OUTPUT_NAME lidar_magic_sdk_static
        ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib
    )
    
    if(NOT WIN32)
        set_target_properties(lidar_magic_sdk_static PROPERTIES
            OUTPUT_NAME lidar_magic_sdk
        )
    endif()
endif()

# ==================== 动态库 ====================
if(BUILD_SHARED_LIBS)
    add_library(lidar_magic_sdk_shared SHARED ${SDK_SOURCES})
    target_include_directories(lidar_magic_sdk_shared PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
        $<INSTALL_INTERFACE:include/lidar_magic>
    )
    target_compile_definitions(lidar_magic_sdk_shared PRIVATE LIDAR_MAGIC_SDK_EXPORTS)
    target_link_libraries(lidar_magic_sdk_shared PUBLIC ${PLATFORM_LIBS})
    
    set_target_properties(lidar_magic_sdk_shared PROPERTIES
        OUTPUT_NAME lidar_magic_sdk
        VERSION ${PROJECT_VERSION}
        SOVERSION ${PROJECT_VERSION_MAJOR}
        LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib
        RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
    )
    
    if(UNIX AND NOT APPLE)
        set_target_properties(lidar_magic_sdk_shared PROPERTIES
            CXX_VISIBILITY_PRESET hidden
            VISIBILITY_INLINES_HIDDEN ON
        )
    endif()
endif()

# ==================== 默认库别名 ====================
if(BUILD_SHARED_LIBS)
    add_library(lidar_magic_sdk ALIAS lidar_magic_sdk_shared)
    set(DEFAULT_SDK_LIB lidar_magic_sdk_shared CACHE INTERNAL "")
elseif(BUILD_STATIC_LIBS)
    add_library(lidar_magic_sdk ALIAS lidar_magic_sdk_static)
    set(DEFAULT_SDK_LIB lidar_magic_sdk_static CACHE INTERNAL "")
endif()

# ==================== 示例程序 ====================
if(BUILD_EXAMPLES)
    # C++示例
    if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/example.cpp)
        add_executable(lidar_example example.cpp)
        target_link_libraries(lidar_example PRIVATE ${DEFAULT_SDK_LIB})
        set_target_properties(lidar_example PROPERTIES
            RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
        )
    endif()
    
    # C语言示例
    if(BUILD_C_EXAMPLE AND EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/example_c.c)
        add_executable(lidar_example_c example_c.c)
        target_link_libraries(lidar_example_c PRIVATE ${DEFAULT_SDK_LIB})
        set_target_properties(lidar_example_c PROPERTIES
            RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
        )
    endif()
endif()

# ==================== 测试程序 ====================
if(BUILD_TESTS)
    if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/test_demo.cpp)
        add_executable(lidar_test_demo test_demo.cpp)
        target_link_libraries(lidar_test_demo PRIVATE ${DEFAULT_SDK_LIB})
        set_target_properties(lidar_test_demo PROPERTIES
            RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
        )
    endif()
    
    if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/test_with_logs.cpp)
        add_executable(lidar_test_with_logs test_with_logs.cpp)
        target_link_libraries(lidar_test_with_logs PRIVATE ${DEFAULT_SDK_LIB})
        set_target_properties(lidar_test_with_logs PROPERTIES
            RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
        )
    endif()
    
    if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/test_multi_interface.cpp)
        add_executable(lidar_test_multi_interface test_multi_interface.cpp)
        target_link_libraries(lidar_test_multi_interface PRIVATE ${DEFAULT_SDK_LIB})
        set_target_properties(lidar_test_multi_interface PROPERTIES
            RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
        )
    endif()
endif()

# ==================== 编译选项 ====================
if(MSVC)
    add_compile_options(/W4 /WX-)
    add_compile_definitions(_CRT_SECURE_NO_WARNINGS)
else()
    add_compile_options(-Wall -Wextra -pedantic)
endif()

# ==================== 安装规则 ====================
include(GNUInstallDirs)

# 安装头文件
install(FILES ${SDK_HEADERS}
    DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/lidar_magic
)

# 安装库文件
if(BUILD_STATIC_LIBS)
    install(TARGETS lidar_magic_sdk_static
        EXPORT LidarMagicSDKTargets
        ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
    )
endif()

if(BUILD_SHARED_LIBS)
    install(TARGETS lidar_magic_sdk_shared
        EXPORT LidarMagicSDKTargets
        LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
    )
endif()

# 安装CMake配置文件
install(EXPORT LidarMagicSDKTargets
    FILE LidarMagicSDKTargets.cmake
    NAMESPACE LidarMagic::
    DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/LidarMagicSDK
)

# 创建版本配置文件
include(CMakePackageConfigHelpers)
write_basic_package_version_file(
    "${CMAKE_CURRENT_BINARY_DIR}/LidarMagicSDKConfigVersion.cmake"
    VERSION ${PROJECT_VERSION}
    COMPATIBILITY SameMajorVersion
)

# 创建配置文件
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/cmake/LidarMagicSDKConfig.cmake.in")
    configure_file(
        "${CMAKE_CURRENT_SOURCE_DIR}/cmake/LidarMagicSDKConfig.cmake.in"
        "${CMAKE_CURRENT_BINARY_DIR}/LidarMagicSDKConfig.cmake"
        @ONLY
    )
    install(FILES
        "${CMAKE_CURRENT_BINARY_DIR}/LidarMagicSDKConfig.cmake"
        "${CMAKE_CURRENT_BINARY_DIR}/LidarMagicSDKConfigVersion.cmake"
        DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/LidarMagicSDK
    )
endif()

# ==================== 打包配置 ====================
set(CPACK_PACKAGE_NAME "LidarMagicSDK")
set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
set(CPACK_PACKAGE_VENDOR "LiDAR Magic")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "LiDAR Magic SDK - Cross-platform LiDAR device SDK")

if(WIN32)
    set(CPACK_GENERATOR "ZIP")
else()
    set(CPACK_GENERATOR "TGZ")
endif()

include(CPack)

# ==================== 构建信息 ====================
message(STATUS "")
message(STATUS "LiDAR Magic SDK Configuration:")
message(STATUS "  Version:        ${PROJECT_VERSION}")
message(STATUS "  Build Type:     ${CMAKE_BUILD_TYPE}")
message(STATUS "  Shared Libs:    ${BUILD_SHARED_LIBS}")
message(STATUS "  Static Libs:    ${BUILD_STATIC_LIBS}")
message(STATUS "  Examples:       ${BUILD_EXAMPLES}")
message(STATUS "  Tests:          ${BUILD_TESTS}")
message(STATUS "  Install Prefix: ${CMAKE_INSTALL_PREFIX}")
message(STATUS "")