cmake_minimum_required(VERSION 3.22.1)
project(mosis-designer)

set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# Find Lua before RmlUi so it can be used
find_package(Lua REQUIRED)

# Find other dependencies via vcpkg
find_package(glfw3 CONFIG REQUIRED)
find_package(freetype CONFIG REQUIRED)
find_package(PNG REQUIRED)
find_package(nlohmann_json CONFIG REQUIRED)

# Fetch RmlUi
include(FetchContent)
FetchContent_Declare(
    rmlui
    GIT_REPOSITORY https://github.com/mikke89/RmlUi.git
    GIT_TAG 6.0
)

# Enable RmlUi Lua bindings before fetching
set(RMLUI_LUA_BINDINGS ON CACHE BOOL "" FORCE)
set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE)
set(RMLUI_SAMPLES OFF CACHE BOOL "" FORCE)
set(RMLUI_TESTS OFF CACHE BOOL "" FORCE)
set(RMLUI_FONT_ENGINE "freetype" CACHE STRING "" FORCE)

FetchContent_MakeAvailable(rmlui)

# Get the RmlUi source directory for backend sources
FetchContent_GetProperties(rmlui)
set(RMLUI_SOURCE_DIR ${rmlui_SOURCE_DIR})

# Shared kernel library sources (platform-agnostic code)
set(KERNEL_SOURCES
    ../src/main/kernel/src/platform.cpp
    ../src/main/kernel/src/file_interface.cpp
)

# Desktop platform sources
set(DESIGNER_SOURCES
    src/main.cpp
    src/desktop_platform.cpp
    src/hot_reload.cpp
    src/data_models.cpp
    src/kernel_impl.cpp
    src/testing/action_recorder.cpp
    src/testing/action_player.cpp
    src/testing/ui_inspector.cpp
    src/testing/visual_capture.cpp
    # RmlUi backend sources
    ${RMLUI_SOURCE_DIR}/Backends/RmlUi_Backend_GLFW_GL3.cpp
    ${RMLUI_SOURCE_DIR}/Backends/RmlUi_Platform_GLFW.cpp
    ${RMLUI_SOURCE_DIR}/Backends/RmlUi_Renderer_GL3.cpp
)

# Designer executable
add_executable(mosis-designer
    ${KERNEL_SOURCES}
    ${DESIGNER_SOURCES}
)

target_include_directories(mosis-designer PRIVATE
    src
    ../src/main/kernel/include
    ${RMLUI_SOURCE_DIR}
    ${RMLUI_SOURCE_DIR}/Backends
    ${LUA_INCLUDE_DIR}
)

target_link_libraries(mosis-designer PRIVATE
    glfw
    freetype
    PNG::PNG
    RmlUi::RmlUi
    RmlUi::Lua
    nlohmann_json::nlohmann_json
)

target_compile_definitions(mosis-designer PRIVATE
    MOSIS_PLATFORM_DESKTOP
    RMLUI_STATIC_LIB
)

# Platform-specific libraries
if(WIN32)
    target_link_libraries(mosis-designer PRIVATE opengl32)
elseif(APPLE)
    find_library(OPENGL_LIBRARY OpenGL)
    target_link_libraries(mosis-designer PRIVATE ${OPENGL_LIBRARY})
else()
    find_package(OpenGL REQUIRED)
    target_link_libraries(mosis-designer PRIVATE OpenGL::GL)
endif()

# Copy assets for development
add_custom_command(TARGET mosis-designer POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_directory
        ${CMAKE_CURRENT_SOURCE_DIR}/../src/main/assets
        $<TARGET_FILE_DIR:mosis-designer>/assets
)
