cmake_minimum_required(VERSION 3.28)
project(DeskRecord VERSION 0.1.0 LANGUAGES C CXX)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

# ---------------------------------------------------------------------------
# Engine (libobs) built from external/obs-studio with the deskrecord-x64 preset
# ---------------------------------------------------------------------------
set(OBS_SRC   "${CMAKE_SOURCE_DIR}/external/obs-studio")
set(OBS_BUILD "${OBS_SRC}/build_x64")
set(OBS_RUNDIR "${OBS_BUILD}/rundir/RelWithDebInfo")
file(GLOB OBS_DEPS_DIR LIST_DIRECTORIES true "${OBS_SRC}/.deps/obs-deps-20*-x64")
file(GLOB QT_DIR       LIST_DIRECTORIES true "${OBS_SRC}/.deps/obs-deps-qt6-*-x64")

if(NOT EXISTS "${OBS_BUILD}/libobs/RelWithDebInfo/obs.lib")
  message(FATAL_ERROR "libobs is not built. Run: cmake --preset deskrecord-x64 && cmake --build --preset deskrecord-x64 in external/obs-studio")
endif()

add_library(libobs SHARED IMPORTED)
set_target_properties(libobs PROPERTIES
  IMPORTED_IMPLIB "${OBS_BUILD}/libobs/RelWithDebInfo/obs.lib"
  IMPORTED_LOCATION "${OBS_RUNDIR}/bin/64bit/obs.dll"
  INTERFACE_INCLUDE_DIRECTORIES "${OBS_SRC}/libobs;${OBS_BUILD}/config;${OBS_BUILD}/libobs")

list(APPEND CMAKE_PREFIX_PATH "${QT_DIR}")

# Offline speech-to-text: whisper.cpp built from external/whisper.cpp
set(WHISPER_CLI "${CMAKE_SOURCE_DIR}/external/whisper.cpp/build/bin/Release/whisper-cli.exe")
if(NOT EXISTS "${WHISPER_CLI}")
  message(FATAL_ERROR "whisper-cli.exe not found. Build external/whisper.cpp (see README).")
endif()
find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets Svg Network Multimedia MultimediaWidgets)

# ---------------------------------------------------------------------------
# SQLite (amalgamation)
# ---------------------------------------------------------------------------
add_library(sqlite3 STATIC third_party/sqlite/sqlite3.c)
target_include_directories(sqlite3 PUBLIC third_party/sqlite)
target_compile_definitions(sqlite3 PRIVATE SQLITE_THREADSAFE=1 SQLITE_DEFAULT_WAL_SYNCHRONOUS=1 SQLITE_OMIT_LOAD_EXTENSION)

# ---------------------------------------------------------------------------
# Application
# ---------------------------------------------------------------------------
file(GLOB_RECURSE APP_SOURCES CONFIGURE_DEPENDS src/*.cpp src/*.h)
add_executable(DeskRecord WIN32 ${APP_SOURCES} resources/resources.qrc resources/app.rc)
target_include_directories(DeskRecord PRIVATE src)
target_link_libraries(DeskRecord PRIVATE libobs sqlite3 Qt6::Widgets Qt6::Svg Qt6::Network Qt6::Multimedia Qt6::MultimediaWidgets dwmapi crypt32 shell32 user32 ole32 powrprof)
target_compile_definitions(DeskRecord PRIVATE UNICODE _UNICODE NOMINMAX WIN32_LEAN_AND_MEAN
  DESKRECORD_VERSION="${PROJECT_VERSION}")
if(MSVC)
  target_compile_options(DeskRecord PRIVATE /utf-8 /W3 /permissive- /Zc:__cplusplus)
  target_compile_options(sqlite3 PRIVATE /utf-8 /W0)
endif()

# Output layout mirrors libobs' expectations: <root>/bin/64bit/DeskRecord.exe,
# <root>/core/<module>/..., <root>/data/libobs/...
set(APP_ROOT "${CMAKE_BINARY_DIR}/app")
set_target_properties(DeskRecord PROPERTIES
  RUNTIME_OUTPUT_DIRECTORY "${APP_ROOT}/bin/64bit"
  RUNTIME_OUTPUT_DIRECTORY_DEBUG "${APP_ROOT}/bin/64bit"
  RUNTIME_OUTPUT_DIRECTORY_RELEASE "${APP_ROOT}/bin/64bit"
  RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO "${APP_ROOT}/bin/64bit"
  VS_DEBUGGER_WORKING_DIRECTORY "${APP_ROOT}/bin/64bit")

# ---------------------------------------------------------------------------
# Deploy engine + Qt runtime next to the executable
# ---------------------------------------------------------------------------
set(QT_RUNTIME_DLLS Qt6Core Qt6Gui Qt6Widgets Qt6Svg Qt6Network Qt6Multimedia Qt6MultimediaWidgets Qt6OpenGL Qt6Concurrent)
set(DEPLOY_CMDS "")
foreach(dll IN LISTS QT_RUNTIME_DLLS)
  list(APPEND DEPLOY_CMDS COMMAND ${CMAKE_COMMAND} -E copy_if_different "${QT_DIR}/bin/${dll}.dll" "${APP_ROOT}/bin/64bit/")
endforeach()

add_custom_command(TARGET DeskRecord POST_BUILD
  COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different "${OBS_RUNDIR}/bin" "${APP_ROOT}/bin"
  COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different "${OBS_RUNDIR}/core" "${APP_ROOT}/core"
  COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different "${OBS_RUNDIR}/data" "${APP_ROOT}/data"
  COMMAND ${CMAKE_COMMAND} -DSRC="${OBS_DEPS_DIR}/bin" -DDST="${APP_ROOT}/bin/64bit" -P "${CMAKE_SOURCE_DIR}/cmake/copy_dlls.cmake"
  COMMAND ${CMAKE_COMMAND} -E copy_if_different "${OBS_DEPS_DIR}/bin/ffmpeg.exe" "${APP_ROOT}/bin/64bit/"
  ${DEPLOY_CMDS}
  COMMAND ${CMAKE_COMMAND} -E make_directory "${APP_ROOT}/bin/64bit/platforms" "${APP_ROOT}/bin/64bit/styles" "${APP_ROOT}/bin/64bit/imageformats" "${APP_ROOT}/bin/64bit/iconengines" "${APP_ROOT}/bin/64bit/multimedia" "${APP_ROOT}/bin/64bit/tls"
  COMMAND ${CMAKE_COMMAND} -DSRC="${QT_DIR}/plugins/multimedia" -DDST="${APP_ROOT}/bin/64bit/multimedia" -P "${CMAKE_SOURCE_DIR}/cmake/copy_dlls.cmake"
  COMMAND ${CMAKE_COMMAND} -DSRC="${QT_DIR}/plugins/tls" -DDST="${APP_ROOT}/bin/64bit/tls" -P "${CMAKE_SOURCE_DIR}/cmake/copy_dlls.cmake"
  COMMAND ${CMAKE_COMMAND} -E copy_if_different "${WHISPER_CLI}" "${APP_ROOT}/bin/64bit/"
  COMMAND ${CMAKE_COMMAND} -E copy_if_different "${QT_DIR}/plugins/platforms/qwindows.dll" "${APP_ROOT}/bin/64bit/platforms/"
  COMMAND ${CMAKE_COMMAND} -DSRC="${QT_DIR}/plugins/styles" -DDST="${APP_ROOT}/bin/64bit/styles" -P "${CMAKE_SOURCE_DIR}/cmake/copy_dlls.cmake"
  COMMAND ${CMAKE_COMMAND} -DSRC="${QT_DIR}/plugins/imageformats" -DDST="${APP_ROOT}/bin/64bit/imageformats" -P "${CMAKE_SOURCE_DIR}/cmake/copy_dlls.cmake"
  COMMAND ${CMAKE_COMMAND} -DSRC="${QT_DIR}/plugins/iconengines" -DDST="${APP_ROOT}/bin/64bit/iconengines" -P "${CMAKE_SOURCE_DIR}/cmake/copy_dlls.cmake"
  COMMENT "Deploying libobs engine and Qt runtime")
