cmake_minimum_required(VERSION 3.25)
project(SimianProject)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# -------------------------
# 1️⃣ Raylib (submodule)
# -------------------------
add_subdirectory(external/raylib)

# -------------------------
# 2️⃣ AngelScript (submodule)
# -------------------------
add_subdirectory(external/angelscript/sdk/angelscript/projects/cmake)

# -------------------------
# PhysFS (submodule)
# -------------------------
add_subdirectory(external/physfs)

# -------------------------
# SNKV (submodule)
# -------------------------
add_library(snkv STATIC
    external/snkv/src/kvstore.c
    external/snkv/src/btree.c
    external/snkv/src/btmutex.c
    external/snkv/src/pager.c
    external/snkv/src/pcache.c
    external/snkv/src/pcache1.c
    external/snkv/src/wal.c
    external/snkv/src/memjournal.c
    external/snkv/src/bitvec.c
    external/snkv/src/os.c
    external/snkv/src/os_unix.c
    external/snkv/src/os_win.c
    external/snkv/src/os_kv.c
    external/snkv/src/mutex.c
    external/snkv/src/mutex_noop.c
    external/snkv/src/mutex_unix.c
    external/snkv/src/mutex_w32.c
    external/snkv/src/malloc.c
    external/snkv/src/status.c
    external/snkv/src/global.c
    external/snkv/src/hash.c
    external/snkv/src/util.c
    external/snkv/src/printf.c
    external/snkv/src/random.c
    external/snkv/src/threads.c
    external/snkv/src/fault.c
    external/snkv/src/mem1.c
)

target_include_directories(snkv PUBLIC
    external/snkv/include
)

# -------------------------
# Dear ImGui (docking branch)
# -------------------------
# Ensure the submodule exists at external/imgui (added with git submodule)
add_subdirectory(cmake/imgui)

# -------------------------
# rlImGui (optional - Raylib ImGui integration)
# -------------------------
# If you add rlImGui as a submodule under external/rlImGui, CMake will pick it up
option(USE_RLIMGUI "Enable rlImGui integration if found in external/rlImGui" ON)
set(RLIMGUI_ROOT "${CMAKE_SOURCE_DIR}/external/rlImGui")
if(USE_RLIMGUI)
    if(EXISTS "${RLIMGUI_ROOT}/CMakeLists.txt")
        message(STATUS "rlImGui CMakeLists found at ${RLIMGUI_ROOT} - adding to build")
        add_subdirectory(${RLIMGUI_ROOT} EXCLUDE_FROM_ALL)
        set(HAVE_RLIMGUI TRUE)
    elseif(EXISTS "${RLIMGUI_ROOT}")
        message(STATUS "rlImGui sources found at ${RLIMGUI_ROOT} - using project wrapper cmake/rlImGui")
        add_subdirectory(cmake/rlImGui)
        set(HAVE_RLIMGUI TRUE)
    else()
        set(HAVE_RLIMGUI FALSE)
    endif()
else()
    set(HAVE_RLIMGUI FALSE)
endif()
# -------------------------
# 3️⃣ scriptstdstring add-on
# -------------------------
add_library(scriptstdstring STATIC
    external/angelscript/sdk/add_on/scriptstdstring/scriptstdstring.cpp
)

target_include_directories(scriptstdstring
    PUBLIC external/angelscript/sdk/angelscript/include
)

# -------------------------
# 3️⃣.1️⃣ scriptbuilder add-on
# -------------------------
add_library(scriptbuilder STATIC
    external/angelscript/sdk/add_on/scriptbuilder/scriptbuilder.cpp
)

target_include_directories(scriptbuilder
    PUBLIC external/angelscript/sdk/angelscript/include
)

# -------------------------
# 3️⃣.2️⃣ scriptarray add-on
# -------------------------
add_library(scriptarray STATIC
    external/angelscript/sdk/add_on/scriptarray/scriptarray.cpp
)

target_include_directories(scriptarray
    PUBLIC external/angelscript/sdk/angelscript/include
)

# -------------------------
# 4️⃣ Simian Core Library (SHARED CODE)
# -------------------------
add_library(simian_core STATIC
    src/Application.cpp
    src/PhysFSManager.cpp
    src/SceneGraph.cpp
    src/SceneLoader.cpp
    src/scripting/ScriptEngine.cpp
    src/scripting/ScriptBindings.cpp
    src/scripting/ToastBindings.cpp
    src/scripting/LogBindings.cpp
    src/scripting/ImageBindings.cpp
    src/scripting/TextureBindings.cpp
    src/scripting/MathBindings.cpp
    src/scripting/ECSBindings.cpp
    src/scripting/ResourceBindings.cpp
    src/scripting/InputBindings.cpp
    src/scripting/SceneBindings.cpp
    src/scripting/PhysFSBindings.cpp
    src/scripting/SNKVBindings.cpp
    src/scripting/GlobalsBindings.cpp
    src/HotReload.cpp
    src/gui/GuiManager.cpp
    src/gui/ImViewGuizmoIntegration.cpp
    src/gui/LogWindow.cpp
    src/log/log.c
    src/ShaderManager.cpp
    src/ModelManager.cpp
    src/MaterialManager.cpp
    src/AssetManager.cpp
    src/TextureManager.cpp
    src/InputManager.cpp
)

target_include_directories(simian_core PUBLIC
    include
    include/scripting
    include/gui
    src/log
    external/raylib/src
    external/angelscript/sdk/angelscript/include
    external/angelscript/sdk/add_on/scriptstdstring
    external/angelscript/sdk/add_on/scriptbuilder
    external/angelscript/sdk/add_on/scriptarray
    external/physfs/src
    external/snkv/include
    external/imgui     
    external/ImViewGuizmo
)

target_link_libraries(simian_core PUBLIC
    raylib
    angelscript
    PhysFS::PhysFS-static
    snkv
    scriptstdstring
    scriptbuilder
    scriptarray
    imgui
)

if(HAVE_RLIMGUI)
    target_include_directories(simian_core PUBLIC ${RLIMGUI_ROOT}/include)
    target_link_libraries(simian_core PUBLIC rlImGui)
    # Expose HAVE_RLIMGUI to the C++ compiler so source can guard ImGui calls
    target_compile_definitions(simian_core PUBLIC HAVE_RLIMGUI=1)
    message(STATUS "Linking rlImGui into simian_core")
else()
    message(STATUS "rlImGui not found - building without rlImGui integration")
endif()

# -------------------------
# 5️⃣ Main executable (just main.cpp)
# -------------------------
add_executable(simian main.cpp)

target_link_libraries(simian PRIVATE simian_core)

# -------------------------
# 6️⃣ Platform-specific linking
# -------------------------
if(WIN32)
    target_link_libraries(simian PRIVATE winmm gdi32)
elseif(UNIX)
    # Linux / macOS: Raylib handles system libs automatically
endif()

# -------------------------
# 7️⃣ Optional: Compile flags
# -------------------------
if(MSVC)
    target_compile_options(simian_core PRIVATE /W4 /EHsc)
else()
    target_compile_options(simian_core PRIVATE -Wall -Wextra -pedantic)
    if(TARGET raylib)
        target_compile_options(raylib PRIVATE -Wno-missing-field-initializers)
    endif()
endif()

# -------------------------
# 8️⃣ Tests
# -------------------------
enable_testing()
add_subdirectory(tests)