cmake_minimum_required(VERSION 3.10)

# set the project name
set (ProjectName WhisperTranscript)
set (Version 1.0.1)

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)

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)
else()
set(ONNX_DIR ${ONNX_DIR}/cpu)
message(Provider:\ NONE)
endif()

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)

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

set(plugin_SRC main.cpp
               TranscriptMediaHandler.cpp
               PluginPreferenceHandler.cpp
               TranscriptAudioSubscriber.cpp
               TranscriptVideoSubscriber.cpp
               stt_whisper.cpp
               ./../lib/accel.cpp
               ./../lib/frameUtils.cpp
               ./../lib/frameFilter.cpp
               ./../lib/resampler.cpp
               ./../lib/common.cpp
               )

set(plugin_HDR TranscriptAudioSubscriber.h
               TranscriptVideoSubscriber.h
               TranscriptMediaHandler.h
               PluginPreferenceHandler.h
               stt_whisper.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
                                                 ${ONNX_DIR}/../include/session
                                                 ${ONNX_DIR}/../include/providers/cuda
                                                 ${CONTRIB_PATH}/build/yaml-cpp/include
                                                 ${CONTRIB_PATH}/build/opendht/include
                                                 ${CONTRIB_PATH}/build/msgpack-c/include
                                                 ${CONTRIB_PATH}/build/whispercpp
                                                 )
target_link_directories(${ProjectName} PUBLIC ${CONTRIB_PATH}
                                              ${CONTRIB_PATH}/build/fmt/msvc/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 libswresample
                                            libavformat libavcodec libavutil libvpx libx264 libopus
                                            libmfx fmt libzlib freetype whisper ws2_32 Bcrypt Secur32 msvcrt)

add_custom_command(
    TARGET ${ProjectName}
    PRE_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJECT_SOURCE_DIR}/../contrib/fmt ${CONTRIB_PATH}/src/fmt
    COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJECT_SOURCE_DIR}/../contrib/zlib ${CONTRIB_PATH}/src/zlib
    COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJECT_SOURCE_DIR}/../contrib/yaml-cpp ${CONTRIB_PATH}/src/yaml-cpp
    COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJECT_SOURCE_DIR}/../contrib/freetype ${CONTRIB_PATH}/src/freetype
    COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJECT_SOURCE_DIR}/ffmpeg/ ${CONTRIB_PATH}/src/ffmpeg
    COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJECT_SOURCE_DIR}/whispercpp/ ${CONTRIB_PATH}/src/whispercpp
    COMMAND python ${DAEMON}/compat/msvc/winmake.py -fb whispercpp
    COMMAND python ${DAEMON}/compat/msvc/winmake.py -fb fmt
    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 freetype
    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}/jfk.wav ${PROJECT_BINARY_DIR}/
        COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/sample.mp4 ${PROJECT_BINARY_DIR}/
        COMMAND ${CMAKE_COMMAND} -E copy ${CONTRIB_PATH}/build/whispercpp/ggml-base.bin ${PROJECT_SOURCE_DIR}/data/assets/
    )
else()
    add_custom_command(
        TARGET ${ProjectName}
        PRE_BUILD
        COMMAND python ${PROJECT_SOURCE_DIR}/../SDK/jplManipulation.py --preassemble --plugin=${ProjectName}
        COMMAND ${CMAKE_COMMAND} -E copy ${CONTRIB_PATH}/build/whispercpp/ggml-base.bin ${JPL_DIRECTORY}/data/assets/
        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}
        COMMENT "Generating JPL archive"
    )
endif()
