cmake_minimum_required(VERSION 3.10)

# set the project name
set (ProjectName GreenScreen)
set (Version 2.0.0)

project(${ProjectName} VERSION ${Version})

set (DAEMON ${PROJECT_SOURCE_DIR}/../../daemon)
set (JPL_FILE_NAME ${ProjectName}.jpl)
set (DAEMON_SRC ${DAEMON}/src)
set (CONTRIB_PATH ${DAEMON}/contrib)
set (PLUGINS_LIB ${PROJECT_SOURCE_DIR}/../lib)
set (JPL_DIRECTORY ${PROJECT_BINARY_DIR}/jpl)
set (LIBS_DIR ${PROJECT_SOURCE_DIR}/../contrib/Libs)
set (ONNX_DIR $ENV{PLUGIN_ENV}/onnxruntime)
set (PREFERENCESFILENAME preferences)

if(WIN32)
    message(OS:\  WINDOWS\ ${CMAKE_SYSTEM_PROCESSOR})
    if (NOT ${CMAKE_CL_64})
        message( FATAL_ERROR "\nUse CMake only for x64 Windows" )
    endif()
    set (CONTRIB_PLATFORM_CURT x64)
    set (CONTRIB_PLATFORM ${CONTRIB_PLATFORM_CURT}-windows)
    set (LIBRARY_FILE_NAME ${ProjectName}.dll)
    set (FFMPEG ${CONTRIB_PATH}/build/ffmpeg/Build/win32/x64)
else()
    message( FATAL_ERROR "\nUse CMake only for Windows! For linux or Android (linux host), use our bash scripts." )
endif()

message(Building:\   ${ProjectName}\   ${Version})
message(Build\ path:\ ${PROJECT_BINARY_DIR})
message(JPL\ assembling\ path:\ ${JPL_DIRECTORY})
message(JPL\ path:\ ${JPL_DIRECTORY}/../../../build/${ProjectName}/${JPL_FILE_NAME})

if(NVIDIA)
add_definitions(-DNVIDIA)
set(ONNX_DIR ${ONNX_DIR}/nvidia-gpu)
message(Provider:\ NVIDIA)
set(EXTRA_PATH nvidia-gpu)
set (PREFERENCESFILENAME ${PREFERENCESFILENAME}-accel)
else()
set(ONNX_DIR ${ONNX_DIR}/cpu)
message(Provider:\ NONE)
set(EXTRA_PATH cpu)
endif()

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)

if(TESTPROCESS)
    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /D__DEBUG__ /MT")
    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /D__DEBUG__ /MT")
else()
    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MT")
    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
endif()

set(plugin_SRC main.cpp
               pluginMediaHandler.cpp
               videoSubscriber.cpp
               pluginProcessor.cpp
               ./../lib/accel.cpp
               ./../lib/frameUtils.cpp
               ./../lib/frameFilter.cpp
               ./../lib/common.cpp
               )

set(plugin_HDR pluginMediaHandler.h
               videoSubscriber.h
               pluginProcessor.h
               ./../lib/pluglog.h
               ./../lib/mediaStream.h
               ./../lib/audioFormat.h
               ./../lib/common.h
               )

if(TESTPROCESS)
    add_executable(${ProjectName} ${plugin_SRC}
                                    ${plugin_HDR}
                                    )
else()
    add_library(${ProjectName} SHARED ${plugin_SRC}
                                        ${plugin_HDR}
                                        )
endif()

target_include_directories(${ProjectName} PUBLIC ${PROJECT_BINARY_DIR}
                                                 ${PROJECT_SOURCE_DIR}
                                                 ${PLUGINS_LIB}
                                                 ${DAEMON_SRC}
                                                 ${CONTRIB_PATH}
                                                 ${CONTRIB_PATH}/build/fmt/include
                                                 ${FFMPEG}/include
                                                 ${CONTRIB_PATH}/build/opencv/build/install/include
                                                 ${ONNX_DIR}/../include/session
                                                 ${ONNX_DIR}/../include/providers/cuda
                                                 ${CONTRIB_PATH}/build/yaml-cpp/include
                                                 )
target_link_directories(${ProjectName} PUBLIC ${CONTRIB_PATH}
                                        ${CONTRIB_PATH}/build/fmt/msvc/Release
                                        ${CONTRIB_PATH}/build/opencv/build/lib/Release
                                        ${CONTRIB_PATH}/build/opencv/build/3rdparty/lib/Release
                                        ${FFMPEG}/lib
                                        ${ONNX_DIR}
                                        ${CONTRIB_PATH}/msvc/lib/x64
                                        ${CONTRIB_PATH}/build/fmt/msvc/Release
                                        ${CONTRIB_PATH}/build/yaml-cpp/msvc/Release
                                        )

target_link_libraries(${ProjectName} PUBLIC libyaml-cppmd libavfilter libswscale libavformat libavcodec libavutil libvpx libx264 libopus libmfx
                                            libzlib ws2_32 Bcrypt Secur32 opencv_imgproc460 opencv_core460 onnxruntime msvcrt)

add_custom_command(
    TARGET ${ProjectName}
    PRE_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJECT_SOURCE_DIR}/zlib ${CONTRIB_PATH}/src/zlib
    COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJECT_SOURCE_DIR}/ffmpeg/ ${CONTRIB_PATH}/src/ffmpeg
    COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJECT_SOURCE_DIR}/../contrib/yaml-cpp ${CONTRIB_PATH}/src/yaml-cpp
    COMMAND python ${DAEMON}/compat/msvc/winmake.py -fb yaml-cpp
    COMMAND python ${DAEMON}/compat/msvc/winmake.py -fb zlib
    COMMAND python ${DAEMON}/compat/msvc/winmake.py -fb ffmpeg
    COMMAND cd ${CONTRIB_PATH}/src/
    COMMAND git checkout *
)
if(TESTPROCESS)
    add_custom_command(
        TARGET ${ProjectName}
        PRE_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/testPreferences.yml ${PROJECT_BINARY_DIR}/
        COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/sample.mp4 ${PROJECT_BINARY_DIR}/
        COMMAND ${CMAKE_COMMAND} -E copy ${ONNX_DIR}/onnxruntime.lib ${PROJECT_BINARY_DIR}/Debug
        COMMAND ${CMAKE_COMMAND} -E copy ${ONNX_DIR}/onnxruntime.dll ${PROJECT_BINARY_DIR}/Debug
        COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_SOURCE_DIR}/data/model
        COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/modelSRC/mModel.onnx ${PROJECT_SOURCE_DIR}/data/model
    )
else()
    add_custom_command(
        TARGET ${ProjectName}
        PRE_BUILD
        COMMAND python ${PROJECT_SOURCE_DIR}/../SDK/jplManipulation.py --preassemble --plugin=${ProjectName}
        COMMAND ${CMAKE_COMMAND} -E copy ${ONNX_DIR}/onnxruntime.lib ${JPL_DIRECTORY}/lib/${CONTRIB_PLATFORM}
        COMMAND ${CMAKE_COMMAND} -E copy ${ONNX_DIR}/onnxruntime.dll ${JPL_DIRECTORY}/lib/${CONTRIB_PLATFORM}
        COMMAND ${CMAKE_COMMAND} -E make_directory ${JPL_DIRECTORY}/data/model
        COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/modelSRC/mModel.onnx ${JPL_DIRECTORY}/data/model
        COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/${PREFERENCESFILENAME}.json ${JPL_DIRECTORY}/data/preferences.json
        COMMENT "Assembling Plugin files"
    )
    add_custom_command(
        TARGET ${ProjectName}
        POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/Release/${ProjectName}.lib ${JPL_DIRECTORY}/lib/${CONTRIB_PLATFORM}
        COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/Release/${LIBRARY_FILE_NAME} ${JPL_DIRECTORY}/lib/${CONTRIB_PLATFORM}
        COMMAND python ${PROJECT_SOURCE_DIR}/../SDK/jplManipulation.py --assemble --plugin=${ProjectName} --extraPath=${EXTRA_PATH}
        COMMENT "Generating JPL archive"
    )
endif()
