cmake_minimum_required(VERSION 3.22)
project("utun_bridge")

set(LIB_DIR  ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../lib)
set(SRC_DIR  ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../src)
set(CFG_DIR  ${CMAKE_CURRENT_SOURCE_DIR}/../../../../libutun_lite)
set(JNI_DIR  ${CMAKE_CURRENT_SOURCE_DIR}/../../../../jni_bridge)
set(TOOLS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../..)

include(${CFG_DIR}/utun_sources.cmake)
utun_setup_sources("${LIB_DIR}" "${SRC_DIR}" "${CFG_DIR}" "${TOOLS_DIR}")

# Include Opus codec wrapper (was excluded before voice support)
# list(FILTER UTUN_SOURCES EXCLUDE REGEX "opus_codec\\.c$")

# Exclude tun_windows and tun_freebsd (Android is Linux-like)
list(FILTER UTUN_SOURCES EXCLUDE REGEX "tun_windows\\.c$")
list(FILTER UTUN_SOURCES EXCLUDE REGEX "tun_freebsd\\.c$")

# Add libopus sources (for voice recording)
file(GLOB_RECURSE _OPUS_SRC "${LIB_DIR}/libopus/src/*.c"
     "${LIB_DIR}/libopus/celt/*.c" "${LIB_DIR}/libopus/silk/*.c"
     "${LIB_DIR}/libopus/silk/float/*.c")
list(FILTER _OPUS_SRC EXCLUDE REGEX "/x86/")
list(APPEND UTUN_SOURCES ${_OPUS_SRC})
list(APPEND UTUN_INCLUDE_DIRS "${LIB_DIR}/libopus" "${LIB_DIR}/libopus/include"
     "${LIB_DIR}/libopus/celt" "${LIB_DIR}/libopus/silk" "${LIB_DIR}/libopus/silk/float")
# Opus requires these to be defined (or HAVE_CONFIG_H + config.h with VAR_ARRAYS)
list(APPEND UTUN_DEFINES OPUS_BUILD VAR_ARRAYS USE_ALLOCA)

# Prebuilt OpenSSL (cross-compiled for Android)
set(OPENSSL_DIR ${CMAKE_CURRENT_SOURCE_DIR}/openssl/${ANDROID_ABI})
add_library(openssl_crypto STATIC IMPORTED)
set_target_properties(openssl_crypto PROPERTIES
    IMPORTED_LOCATION "${OPENSSL_DIR}/lib/libcrypto.a"
)

# OBJECT library: compile .c once, link into SHARED
add_library(utun_core OBJECT ${UTUN_SOURCES})
target_include_directories(utun_core PRIVATE
    ${UTUN_INCLUDE_DIRS} ${JNI_DIR} ${OPENSSL_DIR}/include
)
target_compile_definitions(utun_core PRIVATE ${UTUN_DEFINES} __ANDROID__)
set_target_properties(utun_core PROPERTIES C_STANDARD 99 C_STANDARD_REQUIRED ON)

# JNI bridge + link into shared library
add_library(utun SHARED
    ${JNI_DIR}/android_jni_bridge.c
    ${JNI_DIR}/android_udp_log.c
    $<TARGET_OBJECTS:utun_core>
)

target_include_directories(utun PRIVATE
    ${UTUN_INCLUDE_DIRS} ${JNI_DIR} ${OPENSSL_DIR}/include
)
target_compile_definitions(utun PRIVATE ${UTUN_DEFINES} __ANDROID__)
set_target_properties(utun PROPERTIES C_STANDARD 99 C_STANDARD_REQUIRED ON)

find_library(log-lib log)
target_link_libraries(utun ${log-lib} openssl_crypto)
