cmake_minimum_required(VERSION 3.16)

if(ESP_PLATFORM)
    idf_component_register(
        SRCS
            "nostr_core/nostr_common.c"
            "nostr_core/nostr_log.c"
            "nostr_core/nip001.c"
            "nostr_core/nip004.c"
            "nostr_core/nip006.c"
            "nostr_core/nostr_signer.c"
            "nostr_core/nip019.c"
            "nostr_core/utils.c"
            "nostr_core/crypto/nostr_secp256k1.c"
            "nostr_core/crypto/nostr_aes.c"
            "nostr_core/crypto/nostr_chacha20.c"
            "cjson/cJSON.c"
            "platform/esp32/nostr_platform_esp32.c"
            "platform/esp32/nostr_http_esp32.c"
            "platform/esp32/nostr_websocket_esp32.c"
        INCLUDE_DIRS
            "."
            "nostr_core"
            "nostr_core/crypto"
            "cjson"
            "nostr_websocket"
        REQUIRES
            secp256k1
            esp_hw_support
            esp_http_client
            esp-tls
            tcp_transport
            mbedtls
    )

    target_compile_definitions(${COMPONENT_LIB} PRIVATE NOSTR_NO_FILESYSTEM=1)
else()
    project(nostr_core_lib C)

    add_library(nostr_core STATIC
        nostr_core/nostr_common.c
        nostr_core/nostr_log.c
        nostr_core/request_validator.c
        nostr_core/nip001.c
        nostr_core/nip003.c
        nostr_core/nip004.c
        nostr_core/nip005.c
        nostr_core/nip006.c
        nostr_core/nip011.c
        nostr_core/nip013.c
        nostr_core/nip017.c
        nostr_core/nip019.c
        nostr_core/nip021.c
        nostr_core/nip042.c
        nostr_core/nip044.c
        nostr_core/nip046.c
        nostr_core/nip059.c
        nostr_core/nip060.c
        nostr_core/nip061.c
        nostr_core/nostr_signer.c
        nostr_core/nsigner_transport.c
        nostr_core/nsigner_client.c
        nostr_core/utils.c
        nostr_core/nostr_http.c
        nostr_core/core_relays.c
        nostr_core/core_relay_pool.c
        nostr_core/cashu_mint.c
        nostr_core/blossom_client.c
        nostr_core/crypto/nostr_secp256k1.c
        nostr_core/crypto/nostr_aes.c
        nostr_core/crypto/nostr_chacha20.c
        nostr_core/crypto/nostr_poly1305.c
        nostr_core/crypto/nostr_chacha20poly1305.c
        cjson/cJSON.c
        nostr_websocket/nostr_websocket_openssl.c
        platform/linux.c
    )

    target_include_directories(nostr_core PUBLIC
        .
        nostr_core
        nostr_core/crypto
        cjson
        nostr_websocket
    )
    target_compile_definitions(nostr_core PRIVATE NOSTR_ENABLE_NSIGNER_CLIENT=1)
    target_compile_definitions(nostr_core PRIVATE ENABLE_FILE_LOGGING ENABLE_WEBSOCKET_LOGGING ENABLE_DEBUG_LOGGING)

    # Link system dependencies
    find_package(PkgConfig QUIET)
    if(PkgConfig_FOUND)
        pkg_check_modules(SECP256K1 QUIET libsecp256k1)
        pkg_check_modules(OPENSSL QUIET openssl)
        pkg_check_modules(CURL QUIET libcurl)
    endif()

    if(SECP256K1_FOUND)
        target_include_directories(nostr_core PRIVATE ${SECP256K1_INCLUDE_DIRS})
        target_link_libraries(nostr_core PRIVATE ${SECP256K1_LIBRARIES})
    else()
        target_link_libraries(nostr_core PRIVATE secp256k1)
    endif()

    if(OPENSSL_FOUND)
        target_include_directories(nostr_core PRIVATE ${OPENSSL_INCLUDE_DIRS})
        target_link_libraries(nostr_core PRIVATE ${OPENSSL_LIBRARIES})
    else()
        target_link_libraries(nostr_core PRIVATE ssl crypto)
    endif()

    if(CURL_FOUND)
        target_include_directories(nostr_core PRIVATE ${CURL_INCLUDE_DIRS})
        target_link_libraries(nostr_core PRIVATE ${CURL_LIBRARIES})
    else()
        target_link_libraries(nostr_core PRIVATE curl)
    endif()

    target_link_libraries(nostr_core PRIVATE z dl pthread m)
endif()
