cmake_minimum_required(VERSION 3.24)

project(video-shader VERSION 0.1.0 LANGUAGES CXX C)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

if (NOT WIN32)
  message(FATAL_ERROR "Milestone 1 targets Windows x64 because it uses DeckLink COM and Direct3D 11.")
endif()

set(DECKLINK_SDK_DIR "${CMAKE_CURRENT_SOURCE_DIR}/3rdParty/Blackmagic DeckLink SDK 16.0")
set(DECKLINK_IDL "${DECKLINK_SDK_DIR}/Win/include/DeckLinkAPI.idl")

if (NOT EXISTS "${DECKLINK_IDL}")
  message(FATAL_ERROR "DeckLink SDK not found at ${DECKLINK_SDK_DIR}")
endif()

set(WINDOWS_KITS_10_DIR "$ENV{ProgramFiles\(x86\)}/Windows Kits/10")
file(GLOB WINDOWS_SDK_MIDL_DIRS
  "${WINDOWS_KITS_10_DIR}/bin/*/x64"
  "${WINDOWS_KITS_10_DIR}/bin/*/arm64"
)
list(SORT WINDOWS_SDK_MIDL_DIRS)
list(REVERSE WINDOWS_SDK_MIDL_DIRS)

find_program(MIDL_EXECUTABLE
  NAMES midl midl.exe
  HINTS ${WINDOWS_SDK_MIDL_DIRS}
  DOC "Microsoft Interface Definition Language compiler"
  REQUIRED
)

set(GENERATED_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated")
set(CONFIGURED_DIR "${CMAKE_CURRENT_BINARY_DIR}/configured")
set(DECKLINK_GENERATED_HEADER "${GENERATED_DIR}/DeckLinkAPI_h.h")
set(DECKLINK_GENERATED_IID "${GENERATED_DIR}/DeckLinkAPI_i.c")

add_custom_command(
  OUTPUT "${DECKLINK_GENERATED_HEADER}" "${DECKLINK_GENERATED_IID}"
  COMMAND "${CMAKE_COMMAND}" -E make_directory "${GENERATED_DIR}"
  COMMAND "${MIDL_EXECUTABLE}"
          /nologo
          /char signed
          /env x64
          /h DeckLinkAPI_h.h
          /iid DeckLinkAPI_i.c
          /proxy DeckLinkAPI_p.c
          /tlb DeckLinkAPI.tlb
          /out "${GENERATED_DIR}"
          /I "${DECKLINK_SDK_DIR}/Win/include"
          "${DECKLINK_IDL}"
  DEPENDS "${DECKLINK_IDL}"
  VERBATIM
)

add_library(decklink_api_iids STATIC "${DECKLINK_GENERATED_IID}")
target_include_directories(decklink_api_iids PUBLIC "${GENERATED_DIR}")

set(APP_CONTENT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/web")
set(APP_SHADER_DIR "${CMAKE_CURRENT_SOURCE_DIR}/shaders")
configure_file(src/AppConfig.h.in "${CONFIGURED_DIR}/AppConfig.h" @ONLY)

add_executable(video-shader
  src/main.cpp
  src/AppState.cpp
  src/DeckLinkPipeline.cpp
  src/D3DProcessor.cpp
  src/FileUtil.cpp
  src/JsonUtil.cpp
  src/ShaderLibrary.cpp
  src/WebServer.cpp
)

target_include_directories(video-shader PRIVATE
  "${CMAKE_CURRENT_SOURCE_DIR}/src"
  "${GENERATED_DIR}"
  "${CONFIGURED_DIR}"
)

target_compile_definitions(video-shader PRIVATE
  NOMINMAX
  WIN32_LEAN_AND_MEAN
)

target_link_libraries(video-shader PRIVATE
  decklink_api_iids
  d3d11
  dxgi
  d3dcompiler
  ws2_32
  bcrypt
  ole32
  oleaut32
)

add_custom_command(TARGET video-shader POST_BUILD
  COMMAND "${CMAKE_COMMAND}" -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/web" "$<TARGET_FILE_DIR:video-shader>/web"
  COMMAND "${CMAKE_COMMAND}" -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/shaders" "$<TARGET_FILE_DIR:video-shader>/shaders"
)
