cmake_minimum_required(VERSION 3.22.1)
project(tun2socks_jni)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_C_STANDARD 11)
enable_language(ASM)

set(HEV_DIR ${CMAKE_CURRENT_SOURCE_DIR}/hev-socks5-tunnel)

find_library(log-lib log)

if(EXISTS ${HEV_DIR}/src/hev-main.c)
    message(STATUS "Building with hev-socks5-tunnel")

    # --- yaml ---
    file(GLOB YAML_SOURCES ${HEV_DIR}/third-part/yaml/src/*.c)
    add_library(hev_yaml STATIC ${YAML_SOURCES})
    target_include_directories(hev_yaml PUBLIC ${HEV_DIR}/third-part/yaml/src)
    target_compile_definitions(hev_yaml PRIVATE
        YAML_VERSION_MAJOR=0
        YAML_VERSION_MINOR=2
        YAML_VERSION_PATCH=5
        YAML_VERSION_STRING=\"0.2.5\"
    )

    # --- lwip ---
    file(GLOB_RECURSE LWIP_SOURCES ${HEV_DIR}/third-part/lwip/src/*.c)
    add_library(hev_lwip STATIC ${LWIP_SOURCES})
    target_include_directories(hev_lwip PUBLIC
        ${HEV_DIR}/third-part/lwip/src/include
        ${HEV_DIR}/third-part/lwip/src/ports/include
    )
    target_compile_definitions(hev_lwip PRIVATE FD_SET_DEFINED SOCKLEN_T_DEFINED)

    # --- hev-task-system ---
    file(GLOB_RECURSE TASK_SOURCES ${HEV_DIR}/third-part/hev-task-system/src/*.c)
    set(TASK_ASM ${HEV_DIR}/third-part/hev-task-system/src/kern/task/hev-task-execute.S)
    add_library(hev_task STATIC ${TASK_SOURCES} ${TASK_ASM})
    target_include_directories(hev_task PUBLIC
        ${HEV_DIR}/third-part/hev-task-system/include
        ${HEV_DIR}/third-part/hev-task-system/src
    )
    set_source_files_properties(${TASK_ASM} PROPERTIES COMPILE_FLAGS "-x assembler-with-cpp")
    target_compile_definitions(hev_task PRIVATE
        ENABLE_STACK_OVERFLOW_DETECTION=1
        ENABLE_MEMALLOC_SLICE=1
        ENABLE_IO_SPLICE_SYSCALL=1
        CONFIG_STACK_BACKEND=STACK_MMAP
        CONFIG_STACK_OVERFLOW_DETECTION=1
        CONFIG_MEMALLOC_SLICE_ALIGN=16
        CONFIG_MEMALLOC_SLICE_MAX_SIZE=4096
        CONFIG_MEMALLOC_SLICE_MAX_COUNT=1000
        CONFIG_SCHED_CLOCK=CLOCK_NONE
    )

    # --- hev-socks5-tunnel (без hev-jni.c — свой JNI) ---
    file(GLOB HEV_MAIN_SOURCES ${HEV_DIR}/src/*.c)
    file(GLOB_RECURSE HEV_CORE_SOURCES ${HEV_DIR}/src/core/src/*.c)
    file(GLOB HEV_MISC_SOURCES ${HEV_DIR}/src/misc/*.c)
    list(FILTER HEV_MAIN_SOURCES EXCLUDE REGEX ".*/hev-jni\\.c$")

    add_library(hev_socks5 STATIC
        ${HEV_MAIN_SOURCES}
        ${HEV_CORE_SOURCES}
        ${HEV_MISC_SOURCES}
    )
    target_include_directories(hev_socks5 PUBLIC
        ${HEV_DIR}/src
        ${HEV_DIR}/src/core/include
        ${HEV_DIR}/src/misc
        ${HEV_DIR}/third-part/yaml/include
        ${HEV_DIR}/third-part/lwip/src/include
        ${HEV_DIR}/third-part/lwip/src/ports/include
        ${HEV_DIR}/third-part/hev-task-system/include
    )
    target_compile_definitions(hev_socks5 PRIVATE
        ENABLE_LIBRARY=1
        FD_SET_DEFINED=1
        SOCKLEN_T_DEFINED=1
        COMMIT_ID=\"embedded\"
    )
    target_link_libraries(hev_socks5 PUBLIC hev_yaml hev_lwip hev_task)

    add_library(tun2socks_jni SHARED tun2socks_jni.cpp)
    target_compile_definitions(tun2socks_jni PRIVATE USE_HEV_TUN2SOCKS=1)
    target_include_directories(tun2socks_jni PRIVATE ${HEV_DIR}/src)
    target_link_libraries(tun2socks_jni hev_socks5 ${log-lib} atomic)
else()
    message(WARNING "hev-socks5-tunnel not found — clone into app/src/main/cpp/hev-socks5-tunnel")
    add_library(tun2socks_jni SHARED tun2socks_jni.cpp)
    target_link_libraries(tun2socks_jni ${log-lib})
endif()
