# MeshMC Plugin SDK — headers and CMake config for .mmco module development
#
# This target provides:
#   - The mmco_sdk.h single-include header
#   - PluginAPI.h / PluginHooks.h / MMCOFormat.h  (C ABI definitions)
#   - All transitive MeshMC & library headers required by the SDK
#   - A CMake package config so out-of-tree plugins can:
#       find_package(MeshMC_SDK REQUIRED)
#       target_link_libraries(MyPlugin PRIVATE MeshMC::SDK)

# ---------------------------------------------------------------------------
# INTERFACE library — no compiled code, only headers + include paths
# ---------------------------------------------------------------------------
add_library(MeshMC_sdk INTERFACE)
add_library(MeshMC::SDK ALIAS MeshMC_sdk)
set_target_properties(MeshMC_sdk PROPERTIES EXPORT_NAME SDK)

# Resolve include directories from imported targets (these are installed externally)
get_target_property(_OPTIONAL_BARE_INCLUDE_DIRS optional-bare::optional-bare INTERFACE_INCLUDE_DIRECTORIES)
get_target_property(_KATABASIS_INCLUDE_DIRS Katabasis::Katabasis INTERFACE_INCLUDE_DIRECTORIES)

target_include_directories(MeshMC_sdk INTERFACE
    # Build-tree consumers (in-tree plugins)
    $<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/launcher>
    $<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/launcher/plugin/sdk>
    $<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/buildconfig>
    # Install-tree consumers (out-of-tree plugins)
    $<INSTALL_INTERFACE:include/meshmc-sdk>
    $<INSTALL_INTERFACE:include/meshmc-sdk/plugin/sdk>
)

target_link_libraries(MeshMC_sdk INTERFACE
    Qt6::Core
    Qt6::Widgets
    Qt6::Gui
    Qt6::Network
    optional-bare::optional-bare
    Katabasis::Katabasis
)

# ---------------------------------------------------------------------------
# Collect SDK headers — preserving directory structure
# ---------------------------------------------------------------------------

# SDK's own headers (plugin/sdk/)
set(SDK_OWN_HEADERS
    mmco_sdk.h
)

# Plugin API headers (plugin/)
set(SDK_PLUGIN_HEADERS
    ${CMAKE_SOURCE_DIR}/launcher/plugin/PluginAPI.h
    ${CMAKE_SOURCE_DIR}/launcher/plugin/PluginHooks.h
    ${CMAKE_SOURCE_DIR}/launcher/plugin/MMCOFormat.h
)

# MeshMC launcher headers needed transitively by mmco_sdk.h
# This list is auto-generated by tracing #include dependencies.
set(SDK_LAUNCHER_HEADERS
    ${CMAKE_SOURCE_DIR}/launcher/Application.h
    ${CMAKE_SOURCE_DIR}/launcher/BaseInstance.h
    ${CMAKE_SOURCE_DIR}/launcher/BaseVersion.h
    ${CMAKE_SOURCE_DIR}/launcher/BaseVersionList.h
    ${CMAKE_SOURCE_DIR}/launcher/InstanceList.h
    ${CMAKE_SOURCE_DIR}/launcher/MMCZip.h
    ${CMAKE_SOURCE_DIR}/launcher/MessageLevel.h
    ${CMAKE_SOURCE_DIR}/launcher/QObjectPtr.h
    ${CMAKE_SOURCE_DIR}/launcher/Usable.h
)

set(SDK_MINECRAFT_HEADERS
    ${CMAKE_SOURCE_DIR}/launcher/minecraft/MinecraftInstance.h
    ${CMAKE_SOURCE_DIR}/launcher/minecraft/auth/AccountData.h
    ${CMAKE_SOURCE_DIR}/launcher/minecraft/auth/AuthSession.h
    ${CMAKE_SOURCE_DIR}/launcher/minecraft/auth/MinecraftAccount.h
    ${CMAKE_SOURCE_DIR}/launcher/minecraft/launch/MinecraftServerTarget.h
    ${CMAKE_SOURCE_DIR}/launcher/minecraft/mod/Mod.h
    ${CMAKE_SOURCE_DIR}/launcher/minecraft/mod/ModDetails.h
)

set(SDK_NET_HEADERS
    ${CMAKE_SOURCE_DIR}/launcher/net/Download.h
    ${CMAKE_SOURCE_DIR}/launcher/net/HttpMetaCache.h
    ${CMAKE_SOURCE_DIR}/launcher/net/Mode.h
    ${CMAKE_SOURCE_DIR}/launcher/net/NetAction.h
    ${CMAKE_SOURCE_DIR}/launcher/net/NetJob.h
    ${CMAKE_SOURCE_DIR}/launcher/net/Sink.h
    ${CMAKE_SOURCE_DIR}/launcher/net/Validator.h
)

set(SDK_MISC_HEADERS
    ${CMAKE_SOURCE_DIR}/launcher/java/JavaVersion.h
    ${CMAKE_SOURCE_DIR}/launcher/pathmatcher/IPathMatcher.h
    ${CMAKE_SOURCE_DIR}/launcher/settings/INIFile.h
    ${CMAKE_SOURCE_DIR}/launcher/settings/SettingsObject.h
    ${CMAKE_SOURCE_DIR}/launcher/tasks/Task.h
    ${CMAKE_SOURCE_DIR}/launcher/ui/pages/BasePage.h
    ${CMAKE_SOURCE_DIR}/launcher/ui/pages/BasePageContainer.h
    ${CMAKE_SOURCE_DIR}/launcher/updater/UpdateChecker.h
)

set(SDK_LIBRARY_HEADERS
)

# ---------------------------------------------------------------------------
# Install rules
# ---------------------------------------------------------------------------
set(SDK_INSTALL_DIR "include/meshmc-sdk")

# SDK own headers → include/meshmc-sdk/plugin/sdk/
install(FILES ${SDK_OWN_HEADERS}
    DESTINATION "${SDK_INSTALL_DIR}/plugin/sdk"
)

# Plugin API headers → include/meshmc-sdk/plugin/
install(FILES ${SDK_PLUGIN_HEADERS}
    DESTINATION "${SDK_INSTALL_DIR}/plugin"
)

# Launcher root headers → include/meshmc-sdk/
install(FILES ${SDK_LAUNCHER_HEADERS}
    DESTINATION "${SDK_INSTALL_DIR}"
)

# minecraft/ subtree
install(FILES
    ${CMAKE_SOURCE_DIR}/launcher/minecraft/MinecraftInstance.h
    DESTINATION "${SDK_INSTALL_DIR}/minecraft"
)
install(FILES
    ${CMAKE_SOURCE_DIR}/launcher/minecraft/auth/AccountData.h
    ${CMAKE_SOURCE_DIR}/launcher/minecraft/auth/AuthSession.h
    ${CMAKE_SOURCE_DIR}/launcher/minecraft/auth/MinecraftAccount.h
    DESTINATION "${SDK_INSTALL_DIR}/minecraft/auth"
)
install(FILES
    ${CMAKE_SOURCE_DIR}/launcher/minecraft/launch/MinecraftServerTarget.h
    DESTINATION "${SDK_INSTALL_DIR}/minecraft/launch"
)
install(FILES
    ${CMAKE_SOURCE_DIR}/launcher/minecraft/mod/Mod.h
    ${CMAKE_SOURCE_DIR}/launcher/minecraft/mod/ModDetails.h
    DESTINATION "${SDK_INSTALL_DIR}/minecraft/mod"
)

# net/ subtree
install(FILES ${SDK_NET_HEADERS}
    DESTINATION "${SDK_INSTALL_DIR}/net"
)

# java/
install(FILES
    ${CMAKE_SOURCE_DIR}/launcher/java/JavaVersion.h
    DESTINATION "${SDK_INSTALL_DIR}/java"
)

# pathmatcher/
install(FILES
    ${CMAKE_SOURCE_DIR}/launcher/pathmatcher/IPathMatcher.h
    DESTINATION "${SDK_INSTALL_DIR}/pathmatcher"
)

# settings/
install(FILES
    ${CMAKE_SOURCE_DIR}/launcher/settings/INIFile.h
    ${CMAKE_SOURCE_DIR}/launcher/settings/SettingsObject.h
    DESTINATION "${SDK_INSTALL_DIR}/settings"
)

# tasks/
install(FILES
    ${CMAKE_SOURCE_DIR}/launcher/tasks/Task.h
    DESTINATION "${SDK_INSTALL_DIR}/tasks"
)

# ui/pages/
install(FILES
    ${CMAKE_SOURCE_DIR}/launcher/ui/pages/BasePage.h
    ${CMAKE_SOURCE_DIR}/launcher/ui/pages/BasePageContainer.h
    DESTINATION "${SDK_INSTALL_DIR}/ui/pages"
)

# updater/
install(FILES
    ${CMAKE_SOURCE_DIR}/launcher/updater/UpdateChecker.h
    DESTINATION "${SDK_INSTALL_DIR}/updater"
)

# Library headers — resolve from installed package include directories
foreach(_dir ${_OPTIONAL_BARE_INCLUDE_DIRS})
    if(EXISTS "${_dir}/nonstd/optional")
        install(FILES "${_dir}/nonstd/optional" DESTINATION "${SDK_INSTALL_DIR}/nonstd")
        break()
    endif()
endforeach()
foreach(_dir ${_KATABASIS_INCLUDE_DIRS})
    if(EXISTS "${_dir}/katabasis/Bits.h")
        install(FILES "${_dir}/katabasis/Bits.h" DESTINATION "${SDK_INSTALL_DIR}/katabasis")
        break()
    endif()
endforeach()

# ---------------------------------------------------------------------------
# CMake package config for out-of-tree plugins (find_package support)
# ---------------------------------------------------------------------------
include(CMakePackageConfigHelpers)

configure_package_config_file(
    "${CMAKE_CURRENT_SOURCE_DIR}/MeshMC_SDKConfig.cmake.in"
    "${CMAKE_CURRENT_BINARY_DIR}/MeshMC_SDKConfig.cmake"
    INSTALL_DESTINATION "lib/cmake/MeshMC_SDK"
)

write_basic_package_version_file(
    "${CMAKE_CURRENT_BINARY_DIR}/MeshMC_SDKConfigVersion.cmake"
    VERSION "${MeshMC_RELEASE_VERSION_NAME}"
    COMPATIBILITY AnyNewerVersion
)

install(FILES
    "${CMAKE_CURRENT_BINARY_DIR}/MeshMC_SDKConfig.cmake"
    "${CMAKE_CURRENT_BINARY_DIR}/MeshMC_SDKConfigVersion.cmake"
    DESTINATION "lib/cmake/MeshMC_SDK"
)

install(TARGETS MeshMC_sdk
    EXPORT MeshMC_SDKTargets
)

install(EXPORT MeshMC_SDKTargets
    FILE MeshMC_SDKTargets.cmake
    NAMESPACE MeshMC::
    DESTINATION "lib/cmake/MeshMC_SDK"
)
