cmake_minimum_required(VERSION 3.10)
project(USB2CAN)

# 设置C++标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 添加编译选项
if(WIN32)
    add_definitions(-DWIN32_LEAN_AND_MEAN)
    add_definitions(-DNOMINMAX)
endif()

# 包含目录
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)

# 查找所需的包
find_package(Threads REQUIRED)

# Windows特定的设置
if(WIN32)
    # 添加WinUSB库
    find_library(WINUSB_LIBRARY winusb)
    if(NOT WINUSB_LIBRARY)
        message(FATAL_ERROR "WinUSB library not found")
    endif()
    
    # 添加SetupAPI库
    find_library(SETUPAPI_LIBRARY setupapi)
    if(NOT SETUPAPI_LIBRARY)
        message(FATAL_ERROR "SetupAPI library not found")
    endif()
endif()

# Linux特定的设置
if(UNIX AND NOT APPLE)
    # 查找libusb
    find_package(PkgConfig REQUIRED)
    pkg_check_modules(LIBUSB REQUIRED libusb-1.0)
    
    # 查找libsocketcan
    find_library(SOCKETCAN_LIBRARY socketcan)
    if(NOT SOCKETCAN_LIBRARY)
        message(WARNING "socketcan library not found, using direct socket access")
    endif()
endif()

# macOS特定的设置
if(APPLE)
    # 查找libusb
    find_package(PkgConfig REQUIRED)
    pkg_check_modules(LIBUSB REQUIRED libusb-1.0)
    
    # 设置包含路径
    include_directories(${LIBUSB_INCLUDE_DIRS})
    
    # 在macOS上，我们可能需要使用其他方式访问CAN设备
    # 这里暂时使用Linux的实现作为基础
    message(STATUS "Building for macOS, using Linux platform implementation as base")
endif()

# 源文件
set(PLATFORM_SOURCES
    src/platform/Platform.cpp
)

# Windows特定的源文件
if(WIN32)
    list(APPEND PLATFORM_SOURCES src/platform/WindowsPlatform.cpp)
endif()

# Linux特定的源文件
if(UNIX AND NOT APPLE)
    list(APPEND PLATFORM_SOURCES src/platform/LinuxPlatform.cpp)
endif()

# macOS特定的源文件
if(APPLE)
    # 在macOS上，我们可以使用Linux平台的实现作为基础
    list(APPEND PLATFORM_SOURCES src/platform/LinuxPlatform.cpp)
endif()

set(USB_SOURCES
    src/usb/UsbDevice.cpp
)

# Windows特定的USB源文件
if(WIN32)
    list(APPEND USB_SOURCES src/usb/WinUsbDevice.cpp)
endif()

# Linux特定的USB源文件
if(UNIX AND NOT APPLE)
    list(APPEND USB_SOURCES src/usb/LinuxUsbDevice.cpp)
endif()

# macOS特定的USB源文件
if(APPLE)
    # 在macOS上，我们可以使用Linux平台的实现作为基础
    list(APPEND USB_SOURCES src/usb/LinuxUsbDevice.cpp)
endif()

set(CAN_SOURCES
    src/can/CanController.cpp
    src/can/CanMessage.cpp
    src/can/CanFdController.cpp
)

set(DEVICE_SOURCES
    src/device/Usb2CanDevice.cpp
    src/device/DeviceManager.cpp
)

set(API_SOURCES
    src/api/Usb2Can.cpp
)

# 创建静态库
add_library(usb2can STATIC
    ${PLATFORM_SOURCES}
    ${USB_SOURCES}
    ${CAN_SOURCES}
    ${DEVICE_SOURCES}
    ${API_SOURCES}
)

# 链接库
target_link_libraries(usb2can
    Threads::Threads
)

# Windows特定的链接库
if(WIN32)
    target_link_libraries(usb2can
        ${WINUSB_LIBRARY}
        ${SETUPAPI_LIBRARY}
    )
endif()

# Linux特定的链接库
if(UNIX AND NOT APPLE)
    target_link_libraries(usb2can
        ${LIBUSB_LIBRARIES}
    )
    if(SOCKETCAN_LIBRARY)
        target_link_libraries(usb2can
            ${SOCKETCAN_LIBRARY}
        )
    endif()
endif()

# macOS特定的链接库
if(APPLE)
    target_link_libraries(usb2can
        ${LIBUSB_LIBRARIES}
    )
    # 在macOS上，我们可能需要链接其他库
    # 这里暂时使用Linux的实现作为基础
endif()

# 添加示例
add_subdirectory(examples)

# 添加测试
option(BUILD_TESTS "Build tests" OFF)
if(BUILD_TESTS)
    enable_testing()
    add_subdirectory(tests)
endif()

# 安装规则
install(TARGETS usb2can
    ARCHIVE DESTINATION lib
    LIBRARY DESTINATION lib
    RUNTIME DESTINATION bin
)

install(DIRECTORY include/
    DESTINATION include
)