cmake_minimum_required(VERSION 3.16)

# Linux program. The Windows build stays in Documents/Default Project.
# Packages on Debian or Parrot:
#   build-essential cmake pkg-config libsodium-dev libssl-dev libcurl4-openssl-dev
#   nlohmann-json3-dev libglfw3-dev libgl1-mesa-dev libtss2-dev
#   OpenSSL must be 3.2 or newer (the HPKE header). Ubuntu 24.04's 3.0 is too old.

project(VaultDM LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

if(WIN32)
  message(FATAL_ERROR "Build the Windows program from Documents/Default Project. This folder is the Linux program.")
endif()

find_package(PkgConfig REQUIRED)
pkg_check_modules(SODIUM REQUIRED IMPORTED_TARGET libsodium)
pkg_check_modules(SSL REQUIRED IMPORTED_TARGET libssl)
pkg_check_modules(CRYPTO REQUIRED IMPORTED_TARGET libcrypto)
pkg_check_modules(CURL REQUIRED IMPORTED_TARGET libcurl)
pkg_check_modules(GLFW REQUIRED IMPORTED_TARGET glfw3)
pkg_check_modules(GL REQUIRED IMPORTED_TARGET gl)
pkg_check_modules(TSS2 REQUIRED IMPORTED_TARGET tss2-esys tss2-mu tss2-tctildr)
find_package(Threads REQUIRED)
find_path(NLOHMANN_INCLUDE nlohmann/json.hpp REQUIRED)

set(IMGUI_DIR ${CMAKE_SOURCE_DIR}/third_party/imgui)

add_library(vaultcore STATIC
  app/src/core/crypto.cpp
  app/src/core/ratchet.cpp
  app/src/core/protocol.cpp
  app/src/core/vault_store.cpp
  app/src/core/http.cpp
  app/src/core/core.cpp
  app/src/core/config.cpp
  app/src/core/hello.cpp
  app/src/core/verifier.cpp
  app/src/core/vault_platform_linux.cpp
)
target_include_directories(vaultcore PUBLIC app/src ${NLOHMANN_INCLUDE})
target_compile_options(vaultcore PRIVATE -Wall -Wextra -Werror=return-type)
target_link_libraries(vaultcore PUBLIC
  PkgConfig::SODIUM PkgConfig::SSL PkgConfig::CRYPTO PkgConfig::CURL PkgConfig::TSS2 Threads::Threads)

add_executable(vaultdm-cli app/src/cli/main.cpp)
target_compile_options(vaultdm-cli PRIVATE -Wall -Wextra -Werror=return-type)
target_link_libraries(vaultdm-cli PRIVATE vaultcore)

add_executable(VaultDM
  app/src/ui/main.cpp
  app/src/ui/ui.cpp
  app/src/ui/theme.cpp
  app/src/ui/icons.cpp
  app/src/ui/backdrop.cpp
  ${IMGUI_DIR}/imgui.cpp
  ${IMGUI_DIR}/imgui_draw.cpp
  ${IMGUI_DIR}/imgui_tables.cpp
  ${IMGUI_DIR}/imgui_widgets.cpp
  ${IMGUI_DIR}/backends/imgui_impl_glfw.cpp
  ${IMGUI_DIR}/backends/imgui_impl_opengl3.cpp
)
target_include_directories(VaultDM PRIVATE ${IMGUI_DIR} ${IMGUI_DIR}/backends app/src/ui)
target_compile_options(VaultDM PRIVATE -Wall -Wextra -Werror=return-type)
target_link_libraries(VaultDM PRIVATE vaultcore PkgConfig::GLFW PkgConfig::GL ${CMAKE_DL_LIBS})

foreach(t vaultdm-cli VaultDM)
  add_custom_command(TARGET ${t} POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_SOURCE_DIR}/vaultdm.env.example" "$<TARGET_FILE_DIR:${t}>/vaultdm.env.example")
endforeach()
