cmake_minimum_required(VERSION 3.22.1)
project(AvalabsCryptoNitro CXX C)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(PACKAGE_NAME AvalabsCryptoNitro)

# ---------------------------------------------------------------------------
# 1. Bring in @avalabs/crypto-core as a CMake subdirectory.
#    crypto-core's top-level CMakeLists builds the static
#    `avalabs-crypto-core` library + transitively builds vendored libsecp256k1.
#    The portable backend is wired up; the OpenSSL backend can replace it
#    in a follow-up by setting CRYPTO_BACKEND=openssl.
#
#    Source resolution:
#      - Published tarball: vendor/crypto-core/ (populated by
#        scripts/vendor-crypto-core.sh on prepack). crypto-core is a
#        private package — consumers never install it from npm.
#      - Monorepo dev: ../../../packages-internal/crypto-core (sibling
#        workspace — the android/ subdir adds one extra `..` vs. the
#        package root).
# ---------------------------------------------------------------------------
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../vendor/crypto-core/CMakeLists.txt")
    set(CRYPTO_CORE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../vendor/crypto-core")
elseif(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../../../packages-internal/crypto-core/CMakeLists.txt")
    set(CRYPTO_CORE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../packages-internal/crypto-core")
else()
    message(FATAL_ERROR
        "@avalabs/crypto-core sources not found. Looked in:\n"
        "  ${CMAKE_CURRENT_SOURCE_DIR}/../vendor/crypto-core (published layout)\n"
        "  ${CMAKE_CURRENT_SOURCE_DIR}/../../../packages-internal/crypto-core (monorepo layout)\n"
        "Run: pnpm --filter @avalabs/crypto-nitro run vendor:crypto-core")
endif()

if(NOT EXISTS "${CRYPTO_CORE_DIR}/deps/secp256k1/CMakeLists.txt")
    message(FATAL_ERROR
        "libsecp256k1 not vendored at ${CRYPTO_CORE_DIR}/deps/secp256k1.\n"
        "Run: pnpm --filter @avalabs/crypto-nitro run vendor:crypto-core")
endif()

add_subdirectory("${CRYPTO_CORE_DIR}" crypto-core-build EXCLUDE_FROM_ALL)

# ---------------------------------------------------------------------------
# 2. Nitro bridge — define the library target before pulling in Nitrogen's
#    autolinking helpers (which call target_sources/target_compile_definitions
#    on this target).
# ---------------------------------------------------------------------------
add_library(${PACKAGE_NAME} SHARED
    "${CMAKE_CURRENT_SOURCE_DIR}/../cpp/CryptoHybrid.cpp"
    "${CMAKE_CURRENT_SOURCE_DIR}/cpp-adapter.cpp"
)

target_include_directories(${PACKAGE_NAME} PRIVATE
    "${CMAKE_CURRENT_SOURCE_DIR}/../cpp"
)

include("${CMAKE_CURRENT_SOURCE_DIR}/../nitrogen/generated/android/${PACKAGE_NAME}+autolinking.cmake")

target_link_libraries(${PACKAGE_NAME}
    avalabs-crypto-core
    android
    log
)

target_compile_options(${PACKAGE_NAME} PRIVATE
    -O3
    -fvisibility=hidden
    -fvisibility-inlines-hidden
)
