cmake_minimum_required(VERSION 3.24)
file(READ "${CMAKE_CURRENT_SOURCE_DIR}/verification/format-v1.json" _format)
string(JSON _version GET "${_format}" verifier version)
project(PhotonFileVerifier VERSION "${_version}" LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
include(CTest)
find_package(Qt6 6.8 REQUIRED COMPONENTS Core)
find_package(OpenSSL 3.5 REQUIRED COMPONENTS Crypto)
find_path(SODIUM_INCLUDE_DIR sodium.h REQUIRED)
find_library(SODIUM_LIBRARY NAMES sodium libsodium REQUIRED)
find_package(Python3 3.9 REQUIRED COMPONENTS Interpreter)
find_program(NODE_EXECUTABLE node REQUIRED)

add_subdirectory(src/lib/pfv_writer)

set(_tools "${CMAKE_CURRENT_SOURCE_DIR}/verification/tools")
add_library(photonfile-verification STATIC
  "${_tools}/pfv_archive.cpp" "${_tools}/secret_cleanup.cpp"
  "${_tools}/vault_verification.cpp" "${_tools}/verification_report.cpp")
target_include_directories(photonfile-verification PUBLIC "${_tools}"
  "${CMAKE_CURRENT_SOURCE_DIR}/src/lib/client_side_crypto" "${SODIUM_INCLUDE_DIR}")
target_link_libraries(photonfile-verification PUBLIC pf::PfvWriter Qt6::Core "${SODIUM_LIBRARY}" PRIVATE OpenSSL::Crypto)

add_custom_target(verifier-build-info
  COMMAND "${Python3_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/tools/write_standalone_build_info.py"
    --source-dir "${CMAKE_CURRENT_SOURCE_DIR}" --output "${CMAKE_CURRENT_BINARY_DIR}/verifier_build_info.hpp"
    --target "${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}" --architecture "${CMAKE_SYSTEM_PROCESSOR}"
  BYPRODUCTS "${CMAKE_CURRENT_BINARY_DIR}/verifier_build_info.hpp" VERBATIM)
add_executable(photonfile-verify "${_tools}/photonfile_verify.cpp")
add_dependencies(photonfile-verify verifier-build-info)
target_include_directories(photonfile-verify PRIVATE "${CMAKE_CURRENT_BINARY_DIR}")
target_link_libraries(photonfile-verify PRIVATE photonfile-verification)
set_target_properties(photonfile-verify PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin")
add_custom_target(verifier-vectors ALL
  COMMAND "${CMAKE_COMMAND}" -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/verification/test_vectors"
    "${CMAKE_CURRENT_BINARY_DIR}/share/photonfile-verifier/test_vectors" VERBATIM)
add_custom_target(verifier-browser ALL
  COMMAND "${Python3_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/verification/browser/build_bundle.py"
    --output "${CMAKE_CURRENT_BINARY_DIR}/verification-browser" --overwrite VERBATIM)
install(TARGETS photonfile-verify RUNTIME DESTINATION bin)
install(DIRECTORY verification/test_vectors DESTINATION share/photonfile-verifier)

if(BUILD_TESTING)
  foreach(_test test_setup test_release_contract test_release_signing test_release_archives test_release_transport)
    add_test(NAME "${_test}" COMMAND "${Python3_EXECUTABLE}" -m unittest "verification.tests.${_test}")
    set_tests_properties("${_test}" PROPERTIES WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
  endforeach()
  find_package(GTest REQUIRED)
  foreach(_test pfv_archive_tests vault_verification_tests verification_report_tests)
    add_executable("${_test}" "verification/tests/${_test}.cpp")
    target_link_libraries("${_test}" PRIVATE photonfile-verification GTest::gtest GTest::gtest_main OpenSSL::Crypto)
    target_compile_definitions("${_test}" PRIVATE PF_VERIFICATION_SOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}")
    add_test(NAME "${_test}" COMMAND "${_test}")
  endforeach()
  add_test(NAME export-interop COMMAND "${NODE_EXECUTABLE}"
    "${CMAKE_CURRENT_SOURCE_DIR}/verification/tests/export_interop_test.mjs" "$<TARGET_FILE:photonfile-verify>")
  add_test(NAME vectors-export COMMAND photonfile-verify run-test-vectors --export --json
    --vectors "${CMAKE_CURRENT_SOURCE_DIR}/verification/test_vectors/export_v1/manifest.json")
  add_test(NAME vectors-v1 COMMAND photonfile-verify run-test-vectors --json)
  add_test(NAME vectors-v0 COMMAND photonfile-verify run-test-vectors --allow-legacy-v0
    --vectors "${CMAKE_CURRENT_SOURCE_DIR}/verification/test_vectors/v0/manifest.json" --json)
  add_test(NAME constants COMMAND "${Python3_EXECUTABLE}" scripts/generate_verification_format_constants.py --check)
  set_tests_properties(constants PROPERTIES WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
  foreach(_test node_v1_verifier_test.js node_pfv_archive_test.js v1_fixture_corpus_test.mjs v0_fixture_sanity_test.mjs)
    add_test(NAME "${_test}" COMMAND "${NODE_EXECUTABLE}" "verification/tests/${_test}")
    set_tests_properties("${_test}" PROPERTIES WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
  endforeach()
endif()
