cmake_minimum_required(VERSION 3.16)

project(UvcSDKExamples LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE Release)
endif()

if(CMAKE_CONFIGURATION_TYPES)
    set(CMAKE_CONFIGURATION_TYPES Debug Release)
    set(CMAKE_CONFIGURATION_TYPES "${CMAKE_CONFIGURATION_TYPES}" CACHE STRING
        "Reset the configurations to what we need"
        FORCE)
endif()

set(slncam_link_dirs)
set(slncam_link_libs)

if(WIN32)
    set(slncam_platform win)
    if(NOT CMAKE_GENERATOR_PLATFORM)
        set(CMAKE_GENERATOR_PLATFORM x64)
    endif()

    if(CMAKE_GENERATOR_PLATFORM STREQUAL Win32)
        set(slncam_arch x86)
        set(slncam_definitions -D__L_WIN32__)
    else()
        set(slncam_arch ${CMAKE_GENERATOR_PLATFORM})
        set(slncam_definitions -D__L_WIN64__)
    endif()

    list(APPEND slncam_link_dirs ${PROJECT_SOURCE_DIR}/../sdk/win/slncam/lib/${slncam_arch})
    list(APPEND slncam_link_dirs ${PROJECT_SOURCE_DIR}/../sdk/win/SDL2/lib/${slncam_arch})
    list(APPEND slncam_link_libs SDL2 SDL2main)
elseif(UNIX AND NOT APPLE)
    add_subdirectory(../sdk/linux/SDL2 build)

    set(slncam_platform linux)
    if("${CMAKE_SIZEOF_VOID_P}" MATCHES 8)
        set(slncam_arch x64)
        set(slncam_definitions -D__L_LINUX64__)
    else()
        set(slncam_arch x86)
        set(slncam_definitions -D__L_LINUX32__)
    endif()

    list(APPEND slncam_link_dirs ${PROJECT_SOURCE_DIR}/../sdk/linux/slncam/lib/${slncam_arch})
    list(APPEND slncam_link_dirs ${PROJECT_SOURCE_DIR}/../sdk/linux/FFmpeg/lib/${slncam_arch})
    list(APPEND slncam_link_libs dl pthread SDL2::SDL2 SDL2::SDL2main)
    list(APPEND slncam_link_libs avcodec avdevice avfilter avformat avutil postproc swresample swscale)
endif()

set(dest_dir "${CMAKE_BINARY_DIR}/sdk")

foreach(dir IN LISTS slncam_link_dirs)
    file(COPY ${dir} DESTINATION ${dest_dir})
endforeach()

file(GLOB sources CONFIGURE_DEPENDS NetSDKDemo/*cpp NetSDKDemo/*.h)

add_executable(NetSDKDemo ${sources})

target_compile_definitions(NetSDKDemo
    PRIVATE
        ${slncam_definitions}
)

target_include_directories(NetSDKDemo
    PRIVATE 
        ${PROJECT_SOURCE_DIR}/../sdk/${slncam_platform}/slncam/include
        ${PROJECT_SOURCE_DIR}/../sdk/${slncam_platform}/SDL2/include
        ${PROJECT_SOURCE_DIR}/../sdk/${slncam_platform}/nlohmannJson/include
)

target_link_directories(NetSDKDemo
    PRIVATE
        ${dest_dir}/${slncam_arch}
)

target_link_libraries(NetSDKDemo
    PRIVATE
        l_sdk
        ${slncam_link_libs}
)

if(WIN32)
    add_custom_command(TARGET NetSDKDemo POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_directory
            "${PROJECT_SOURCE_DIR}/../sdk/${slncam_platform}/slncam/bin/${slncam_arch}"
            "$<TARGET_FILE_DIR:NetSDKDemo>"
        COMMAND ${CMAKE_COMMAND} -E copy_directory
            "${PROJECT_SOURCE_DIR}/../sdk/${slncam_platform}/FFmpeg/bin/${slncam_arch}"
            "$<TARGET_FILE_DIR:NetSDKDemo>"
        COMMAND ${CMAKE_COMMAND} -E copy_directory
            "${PROJECT_SOURCE_DIR}/../sdk/${slncam_platform}/SDL2/bin/${slncam_arch}"
            "$<TARGET_FILE_DIR:NetSDKDemo>"
    )
endif()
