cmake_minimum_required(VERSION 3.25)
project(MetasequoiaImeVoice LANGUAGES C CXX)
if(APPLE)
    enable_language(OBJC OBJCXX)
endif()
if(PROJECT_IS_TOP_LEVEL)
    include(CTest)
endif()
option(MSIME_VOICE_CAPTURE "Build the cross-platform miniaudio capture adapter" ON)
option(MSIME_VOICE_WINDOWS_APP "Build the imported standalone Windows host" OFF)
find_package(CURL REQUIRED)
find_package(nlohmann_json CONFIG REQUIRED)
find_package(Threads REQUIRED)
add_library(MetasequoiaImeVoice STATIC src/vad.cpp src/cloud_stt_worker.cpp src/text_polisher.cpp src/http_client.cpp src/provider_protocol.cpp)
add_library(MetasequoiaIme::Voice ALIAS MetasequoiaImeVoice)
target_compile_features(MetasequoiaImeVoice PUBLIC cxx_std_17)
target_include_directories(MetasequoiaImeVoice PUBLIC include include/msime/voice)
target_link_libraries(MetasequoiaImeVoice PRIVATE CURL::libcurl nlohmann_json::nlohmann_json PUBLIC Threads::Threads)
if(MSVC)
    target_compile_options(MetasequoiaImeVoice PRIVATE /W4 /utf-8)
else()
    target_compile_options(MetasequoiaImeVoice PRIVATE -Wall -Wextra -Wpedantic)
endif()
if(MSIME_VOICE_CAPTURE)
    if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/third_party/miniaudio/miniaudio.h")
        message(FATAL_ERROR "engine/voice/third_party/miniaudio is vendored in-tree; a missing miniaudio.h means an incomplete checkout")
    endif()
    add_library(MetasequoiaImeVoiceCapture STATIC src/audio_capture.cpp)
    add_library(MetasequoiaIme::VoiceCapture ALIAS MetasequoiaImeVoiceCapture)
    target_compile_features(MetasequoiaImeVoiceCapture PUBLIC cxx_std_17)
    target_include_directories(MetasequoiaImeVoiceCapture PUBLIC include include/msime/voice PRIVATE third_party/miniaudio)
    target_link_libraries(MetasequoiaImeVoiceCapture PUBLIC Threads::Threads PRIVATE ${CMAKE_DL_LIBS})
    if(APPLE)
        target_link_libraries(MetasequoiaImeVoiceCapture PRIVATE "-framework CoreFoundation" "-framework CoreAudio" "-framework AudioToolbox")
    elseif(WIN32)
        target_link_libraries(MetasequoiaImeVoiceCapture PRIVATE ole32)
    else()
        target_link_libraries(MetasequoiaImeVoiceCapture PRIVATE m)
    endif()
endif()
if(BUILD_TESTING)
    find_package(Python3 REQUIRED COMPONENTS Interpreter)
    add_executable(test_voice tests/test_voice.cpp)
    target_link_libraries(test_voice PRIVATE MetasequoiaIme::Voice)
    if(MSVC)
        target_compile_options(test_voice PRIVATE /utf-8)
    endif()
    add_test(NAME voice_audio_contract COMMAND test_voice)
    add_test(NAME voice_http_contract COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tests/test_http.py $<TARGET_FILE:test_voice>)
    if(MSIME_VOICE_CAPTURE)
        add_executable(test_voice_capture tests/test_capture.cpp)
        target_link_libraries(test_voice_capture PRIVATE MetasequoiaIme::VoiceCapture)
        add_test(NAME voice_capture_lifetime COMMAND test_voice_capture)
    endif()
endif()
if(MSIME_VOICE_WINDOWS_APP)
    add_subdirectory(platforms/windows)
endif()
