cmake_minimum_required(VERSION 3.16)
project(mag160c_c LANGUAGES C)

option(MAG160C_BUILD_TESTS "Build MAG160C C tests" ON)
option(MAG160C_BUILD_CLI "Build MAG160C C CLI" ON)

set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS ON)

find_package(PkgConfig QUIET)
if(PkgConfig_FOUND)
    pkg_check_modules(LIBUSB QUIET libusb-1.0)
endif()

# Windows fallback: bundled libusb-1.0 (x64) under third_party/libusb/win64
if(NOT LIBUSB_FOUND AND WIN32)
    set(LIBUSB_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/third_party/libusb/win64")
    if(EXISTS "${LIBUSB_ROOT}/libusb-1.0.x64.a" AND EXISTS "${LIBUSB_ROOT}/libusb.h")
        set(LIBUSB_FOUND TRUE)
        set(LIBUSB_INCLUDE_DIRS "${LIBUSB_ROOT}")
        set(LIBUSB_LIBRARIES "${LIBUSB_ROOT}/libusb-1.0.x64.a")
        set(LIBUSB_CFLAGS_OTHER "")
        set(MAG160C_LIBUSB_DLL "${LIBUSB_ROOT}/libusb-1.0.dll")
    endif()
endif()

if(LIBUSB_FOUND)
    set(MAG160C_HAS_LIBUSB 1)
else()
    set(MAG160C_HAS_LIBUSB 0)
endif()

if(CMAKE_SYSTEM_NAME MATCHES "Linux|Darwin" OR MINGW)
    set(MAG160C_HAS_THREADS 1)
else()
    set(MAG160C_HAS_THREADS 0)
endif()

add_library(mag160c_c STATIC
    src/mag160c_error.c
    src/mag160c_frame.c
    src/mag160c_temp.c
    src/mag160c_display.c
    src/mag160c_tcm.c
    src/mag160c_ir.c
)

target_include_directories(mag160c_c
    PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include
    PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src
)

target_compile_definitions(mag160c_c PUBLIC
    MAG160C_HAS_LIBUSB=${MAG160C_HAS_LIBUSB}
    MAG160C_HAS_THREADS=${MAG160C_HAS_THREADS}
)

if(LIBUSB_FOUND)
    target_include_directories(mag160c_c PRIVATE ${LIBUSB_INCLUDE_DIRS})
    target_link_libraries(mag160c_c PRIVATE ${LIBUSB_LIBRARIES})
    target_compile_options(mag160c_c PRIVATE ${LIBUSB_CFLAGS_OTHER})
    if(DEFINED MAG160C_LIBUSB_DLL AND TARGET mag160c-cli)
        add_custom_command(TARGET mag160c-cli POST_BUILD
            COMMAND ${CMAKE_COMMAND} -E copy_if_different
                    "${MAG160C_LIBUSB_DLL}" "$<TARGET_FILE_DIR:mag160c-cli>")
    endif()
endif()

if(MINGW)
    target_link_libraries(mag160c_c PUBLIC pthread)
endif()

if(MAG160C_BUILD_CLI)
    add_executable(mag160c-cli tools/mag160c_cli.c)
    target_link_libraries(mag160c-cli PRIVATE mag160c_c)
endif()

if(MAG160C_BUILD_TESTS)
    enable_testing()

    foreach(t test_frame test_temp test_display test_tcm test_api)
        add_executable(${t} tests/${t}.c)
        target_link_libraries(${t} PRIVATE mag160c_c)
        add_test(NAME ${t} COMMAND ${t})
    endforeach()
endif()
