find_package(Vulkan REQUIRED)
find_package(SDL3 CONFIG REQUIRED)
find_program(GLSLC glslc REQUIRED)

set(MT_NATIVE_VERT_SPV "${CMAKE_CURRENT_BINARY_DIR}/native.vert.spv")
set(MT_NATIVE_FRAG_SPV "${CMAKE_CURRENT_BINARY_DIR}/native.frag.spv")
add_custom_command(OUTPUT "${MT_NATIVE_VERT_SPV}"
    COMMAND "${GLSLC}" -fshader-stage=vert "${CMAKE_CURRENT_SOURCE_DIR}/shaders/native.vert" -o "${MT_NATIVE_VERT_SPV}"
    DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/shaders/native.vert")
add_custom_command(OUTPUT "${MT_NATIVE_FRAG_SPV}"
    COMMAND "${GLSLC}" -fshader-stage=frag "${CMAKE_CURRENT_SOURCE_DIR}/shaders/native.frag" -o "${MT_NATIVE_FRAG_SPV}"
    DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/shaders/native.frag")
add_custom_target(mt_native_shaders DEPENDS "${MT_NATIVE_VERT_SPV}" "${MT_NATIVE_FRAG_SPV}")

set(MT_NATIVE_RENDER_SOURCES
    main.cpp
    audio_decode.cpp
    frame_policy.cpp
    host_util.cpp
    input_keymap.cpp
    live_client.cpp
    native_audio.cpp
    render_state.cpp
    texture_decode.cpp
    vulkan_window.cpp
    sdl_window.cpp
    ui_batches.cpp
    ui_scale.cpp
    vk_device.cpp
    vk_frame.cpp
    vk_pipelines.cpp
    vk_scene.cpp
    vk_resources.cpp
    vk_textures.cpp
    stb_image_impl.cpp
    dxt.cpp
)
if(TARGET port_platform AND TARGET mtpython)
    list(APPEND MT_NATIVE_RENDER_SOURCES
        "${PROJECT_SOURCE_DIR}/tests/port/port_login_flow_server.cpp"
        "${PROJECT_SOURCE_DIR}/tests/port/classic/classic_cipher.cpp"
    )
endif()

if(ANDROID)
    # SDLActivity loads libmain.so; Android does not launch a native executable.
    set(MT_NATIVE_TARGET main)
    add_library(${MT_NATIVE_TARGET} SHARED ${MT_NATIVE_RENDER_SOURCES})
else()
    set(MT_NATIVE_TARGET mt_native_render)
    add_executable(${MT_NATIVE_TARGET} ${MT_NATIVE_RENDER_SOURCES})
endif()
if(APPLE)
    set_target_properties(${MT_NATIVE_TARGET} PROPERTIES
        OSX_ARCHITECTURES "${CMAKE_HOST_SYSTEM_PROCESSOR}"
    )
endif()
add_dependencies(${MT_NATIVE_TARGET} mt_native_shaders)
target_include_directories(${MT_NATIVE_TARGET} PRIVATE
    "${CMAKE_CURRENT_SOURCE_DIR}/third_party"
    "${PROJECT_SOURCE_DIR}/src"
    "${PROJECT_SOURCE_DIR}/src/platform/EterLib")
if(NOT ANDROID)
    add_custom_command(TARGET ${MT_NATIVE_TARGET} POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_if_different
            "${MT_NATIVE_VERT_SPV}" "$<TARGET_FILE_DIR:${MT_NATIVE_TARGET}>/native.vert.spv"
        COMMAND ${CMAKE_COMMAND} -E copy_if_different
            "${MT_NATIVE_FRAG_SPV}" "$<TARGET_FILE_DIR:${MT_NATIVE_TARGET}>/native.frag.spv")
endif()
target_link_libraries(${MT_NATIVE_TARGET} PRIVATE Vulkan::Vulkan SDL3::SDL3)
if(TARGET port_platform AND TARGET mtpython)
    target_compile_definitions(${MT_NATIVE_TARGET} PRIVATE MT_NATIVE_HAS_LIVE_CLIENT=1)
    target_link_libraries(${MT_NATIVE_TARGET} PRIVATE port_platform)
    if(TARGET mtpython_stdlib)
        add_dependencies(${MT_NATIVE_TARGET} mtpython_stdlib)
        if(NOT ANDROID)
            add_custom_command(TARGET ${MT_NATIVE_TARGET} POST_BUILD
                COMMAND ${CMAKE_COMMAND} -E copy_if_different
                    "${MT_PYTHON_STDLIB_ZIP}" "$<TARGET_FILE_DIR:${MT_NATIVE_TARGET}>/python27.zip")
        endif()
    endif()
endif()

if(ANDROID)
    # Add this directory to the SDL Android app's assets.srcDirs.
    set(MT_NATIVE_ANDROID_ASSETS "${CMAKE_CURRENT_BINARY_DIR}/android-assets")
    add_custom_target(mt_native_android_assets ALL
        COMMAND ${CMAKE_COMMAND} -E make_directory "${MT_NATIVE_ANDROID_ASSETS}"
        COMMAND ${CMAKE_COMMAND} -E copy_if_different "${MT_NATIVE_VERT_SPV}" "${MT_NATIVE_ANDROID_ASSETS}/native.vert.spv"
        COMMAND ${CMAKE_COMMAND} -E copy_if_different "${MT_NATIVE_FRAG_SPV}" "${MT_NATIVE_ANDROID_ASSETS}/native.frag.spv"
        DEPENDS mt_native_shaders)
    if(TARGET mtpython_stdlib)
        add_dependencies(mt_native_android_assets mtpython_stdlib)
        add_custom_command(TARGET mt_native_android_assets POST_BUILD
            COMMAND ${CMAKE_COMMAND} -E copy_if_different
                "${MT_PYTHON_STDLIB_ZIP}" "${MT_NATIVE_ANDROID_ASSETS}/python27.zip")
    endif()
endif()

# audio_decode against synthetic .wav and every .wav/.mp3 of the real 40250 Client (pack + BGM).
if(NOT ANDROID AND TARGET port_platform AND BUILD_TESTING)
    add_executable(host_audio_decode_test
        "${PROJECT_SOURCE_DIR}/tests/host/audio_decode_test.cpp"
        audio_decode.cpp)
    target_include_directories(host_audio_decode_test PRIVATE
        "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/third_party")
    target_link_libraries(host_audio_decode_test PRIVATE port_platform SDL3::SDL3)
    add_test(NAME host.audio_decode COMMAND $<TARGET_FILE:host_audio_decode_test> "${MT_40250_CLIENT}")
    set_tests_properties(host.audio_decode PROPERTIES SKIP_RETURN_CODE 77)
endif()
