cmake_minimum_required(VERSION 3.22)
project(kazeia-jni)

set(JNILIBS_DIR ${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI})

# --- External source paths (for kazeia_llm llama.cpp backend) ---
set(KAZEIA_LLM_DIR    /opt/Kazeia/kazeia-llm)
set(LLAMA_UPSTREAM    /opt/Kazeia/llama-upstream)

# --- Genie JNI bridge (legacy QNN backend, kept for fallback) ---
add_library(genie_jni SHARED genie_jni.cpp)

add_library(Genie SHARED IMPORTED)
set_target_properties(Genie PROPERTIES IMPORTED_LOCATION ${JNILIBS_DIR}/libGenie.so)

target_link_libraries(genie_jni Genie android log)
target_compile_options(genie_jni PRIVATE -std=c++17 -O2)

# --- Whisper JNI bridge ---
add_library(whisper_jni SHARED whisper_jni.cpp)

# Prebuilt whisper + ggml libs
add_library(whisper SHARED IMPORTED)
set_target_properties(whisper PROPERTIES IMPORTED_LOCATION ${JNILIBS_DIR}/libwhisper.so)

add_library(ggml SHARED IMPORTED)
set_target_properties(ggml PROPERTIES IMPORTED_LOCATION ${JNILIBS_DIR}/libggml.so)

add_library(ggml-base SHARED IMPORTED)
set_target_properties(ggml-base PROPERTIES IMPORTED_LOCATION ${JNILIBS_DIR}/libggml-base.so)

add_library(ggml-cpu SHARED IMPORTED)
set_target_properties(ggml-cpu PROPERTIES IMPORTED_LOCATION ${JNILIBS_DIR}/libggml-cpu.so)

# Include whisper.h
target_include_directories(whisper_jni PRIVATE
    /opt/Kazeia/whisper.cpp/include
    /opt/Kazeia/whisper.cpp/ggml/include
)

target_link_libraries(whisper_jni whisper ggml ggml-base ggml-cpu android log)
target_compile_options(whisper_jni PRIVATE -std=c++17 -O2)

# --- TTS Pipeline: built externally via ExecuTorch cmake, copied to jniLibs ---
# Build with: cd /opt/Kazeia/executorch/build-android && cmake --build . --target tts_pipeline_jni -j$(nproc)
# Then copy to jniLibs/arm64-v8a/libtts_pipeline.so

# --- NEON optimized ops for TTS heads ---
add_library(neon_ops SHARED neon_ops.cpp)
target_link_libraries(neon_ops log)
target_compile_options(neon_ops PRIVATE -std=c++17 -O3 -march=armv8.2-a+fp16)

# --- Mel Extractor (HuggingFace-compatible, no whisper.cpp dependency) ---
add_library(mel_extractor SHARED mel_extractor.cpp)
target_link_libraries(mel_extractor android log)
target_compile_options(mel_extractor PRIVATE -std=c++17 -O2)

# --- Kazeia LLM JNI bridge : llama.cpp upstream backend (primary LLM path) ---
# Replaces the Genie/QNN path for Qwen3.5-4B. Compiles the KazeiaLLM C++
# wrapper directly from /opt/Kazeia/kazeia-llm/ so there is no .a to ship
# separately. Links against libllama.so shipped in jniLibs (synced from
# /opt/Kazeia/llama-upstream/build-android/bin/).
add_library(llama SHARED IMPORTED)
set_target_properties(llama PROPERTIES IMPORTED_LOCATION ${JNILIBS_DIR}/libllama.so)

add_library(kazeia_llm_jni SHARED
    kazeia_llm_jni.cpp
    ${KAZEIA_LLM_DIR}/src/kazeia_llm.cpp)

target_include_directories(kazeia_llm_jni PRIVATE
    ${KAZEIA_LLM_DIR}/include
    ${LLAMA_UPSTREAM}/include
    ${LLAMA_UPSTREAM}/ggml/include)

target_link_libraries(kazeia_llm_jni llama ggml ggml-base ggml-cpu android log)
target_compile_options(kazeia_llm_jni PRIVATE -std=c++17 -O3 -Wall -Wextra
    -Wno-unused-parameter -Wno-unused-variable)
