cmake_minimum_required(VERSION 3.16)
project(nnx_engine VERSION 2.0)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# Security and release flags
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Werror -Wconversion -Wshadow")
set(CMAKE_CXX_FLAGS_RELEASE "-O2 -D_FORTIFY_SOURCE=2 -fstack-protector-strong -fPIE -Wl,-z,relro,-z,now")
set(CMAKE_CXX_FLAGS_DEBUG "-g -fsanitize=address,undefined")

find_package(PkgConfig REQUIRED)
pkg_check_modules(CURL REQUIRED libcurl)
pkg_check_modules(OPENSSL REQUIRED openssl)
pkg_check_modules(SYSTEMD REQUIRED libsystemd)
pkg_check_modules(SODIUM REQUIRED libsodium)
pkg_check_modules(MARIADB REQUIRED libmariadb)

set(ENGINE_SOURCES
    main.cpp
    engine_config.cpp
    engine_crypto.cpp
    engine_vault.cpp
    engine_http.cpp
    engine_artifact.cpp
    engine_payment.cpp
    engine_fulfillment.cpp
    engine_email.cpp
    engine_security.cpp
    engine_subsystems.cpp
    engine_bridge.cpp
    engine_ollama.cpp
    engine_orchestrator.cpp
)

add_executable(nnx ${ENGINE_SOURCES})
set_target_properties(nnx PROPERTIES OUTPUT_NAME "nnx") # ENG-01: generic name, disguised at runtime as [kworker/u4:2]

target_include_directories(nnx PRIVATE
    ${CURL_INCLUDE_DIRS}
    ${OPENSSL_INCLUDE_DIRS}
    ${SYSTEMD_INCLUDE_DIRS}
    ${SODIUM_INCLUDE_DIRS}
    ${MARIADB_INCLUDE_DIRS}
)

target_link_libraries(nnx
    ${CURL_LIBRARIES}
    ${OPENSSL_LIBRARIES}
    ${SYSTEMD_LIBRARIES}
    ${SODIUM_LIBRARIES}
    ${MARIADB_LIBRARIES}
    pthread
)

# Standalone tools
add_executable(verify-hmac verify-hmac.cpp engine_crypto.cpp)
target_include_directories(verify-hmac PRIVATE ${OPENSSL_INCLUDE_DIRS} ${SODIUM_INCLUDE_DIRS})
target_link_libraries(verify-hmac ${OPENSSL_LIBRARIES} ${SODIUM_LIBRARIES})

add_executable(fetch-key-integrated fetch-key-integrated.cpp engine_crypto.cpp)
target_include_directories(fetch-key-integrated PRIVATE ${CURL_INCLUDE_DIRS} ${OPENSSL_INCLUDE_DIRS} ${SODIUM_INCLUDE_DIRS})
target_link_libraries(fetch-key-integrated ${CURL_LIBRARIES} ${OPENSSL_LIBRARIES} ${SODIUM_LIBRARIES})

install(TARGETS nnx DESTINATION /opt/binary/engine/)
install(FILES engine.conf DESTINATION /etc/binary/)
install(FILES nnx.service DESTINATION /etc/systemd/system/)
