cmake_minimum_required(VERSION 4.2)
project(ColorRace)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# --- CPM.cmake Bootstrap ---
set(CPM_DOWNLOAD_VERSION 0.40.2)
set(CPM_DOWNLOAD_LOCATION "${CMAKE_BINARY_DIR}/cmake/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
if(NOT EXISTS ${CPM_DOWNLOAD_LOCATION})
    file(DOWNLOAD
            https://github.com/cpm-cmake/CPM.cmake/releases/download/v${CPM_DOWNLOAD_VERSION}/CPM.cmake
            ${CPM_DOWNLOAD_LOCATION}
    )
endif()
include(${CPM_DOWNLOAD_LOCATION})

# --- OpenGL (systemseitig, kein CPM nötig) ---
find_package(OpenGL REQUIRED)

# --- GLFW ---
CPMAddPackage(
        NAME glfw
        GITHUB_REPOSITORY glfw/glfw
        GIT_TAG 3.4
        OPTIONS
        "GLFW_BUILD_EXAMPLES OFF"
        "GLFW_BUILD_TESTS OFF"
        "GLFW_BUILD_DOCS OFF"
        "GLFW_INSTALL OFF"
)

# --- GLM (header-only) ---
CPMAddPackage(
        NAME glm
        GITHUB_REPOSITORY g-truc/glm
        GIT_TAG 1.0.1
)

# --- tinyobjloader ---
CPMAddPackage(
        NAME tinyobjloader
        GITHUB_REPOSITORY tinyobjloader/tinyobjloader
        GIT_TAG v2.0.0rc13
)

# --- stb_image (kein CMake-Projekt, nur Header) ---
CPMAddPackage(
        NAME stb
        GITHUB_REPOSITORY nothings/stb
        GIT_TAG master
        DOWNLOAD_ONLY YES
)
add_library(stb_image STATIC third_party/stb_image_impl.cpp)
target_include_directories(stb_image PUBLIC ${stb_SOURCE_DIR})

# --- Dear ImGui (Core + GLFW/OpenGL3 Backend) ---
CPMAddPackage(
        NAME imgui
        GITHUB_REPOSITORY ocornut/imgui
        GIT_TAG v1.91.5
        DOWNLOAD_ONLY YES
)

CPMAddPackage(
        NAME spdlog
        GITHUB_REPOSITORY gabime/spdlog
        GIT_TAG v1.15.3
)

add_library(imgui STATIC
        ${imgui_SOURCE_DIR}/imgui.cpp
        ${imgui_SOURCE_DIR}/imgui_draw.cpp
        ${imgui_SOURCE_DIR}/imgui_tables.cpp
        ${imgui_SOURCE_DIR}/imgui_widgets.cpp
        ${imgui_SOURCE_DIR}/imgui_demo.cpp
        ${imgui_SOURCE_DIR}/backends/imgui_impl_glfw.cpp
        ${imgui_SOURCE_DIR}/backends/imgui_impl_opengl3.cpp
)
target_include_directories(imgui PUBLIC ${imgui_SOURCE_DIR} ${imgui_SOURCE_DIR}/backends)
target_link_libraries(imgui PUBLIC glfw glad)

# --- GLAD (manuell generiert, siehe README/Hinweis unten) ---
add_library(glad STATIC third_party/glad/src/glad.c)
target_include_directories(glad PUBLIC third_party/glad/include)

# Engine als statische Lib
add_library(Engine STATIC
        engine/src/core/Window.h
        engine/src/core/Window.cpp
        engine/src/core/Application.cpp
        engine/src/core/Application.h
        engine/src/core/EngineConfig.h
        engine/src/utils/openglWrapper/GLStateCache.cpp
        engine/src/utils/openglWrapper/GLStateCache.h
        engine/src/utils/openglWrapper/GLRenderState.cpp
        engine/src/utils/openglWrapper/GLRenderState.h
        engine/src/utils/openglWrapper/openglObjects/Attribute.cpp
        engine/src/utils/openglWrapper/openglObjects/Attribute.h
        engine/src/utils/openglWrapper/openglObjects/Vbo.cpp
        engine/src/utils/openglWrapper/openglObjects/Vbo.h
        engine/src/utils/openglWrapper/openglObjects/Vao.cpp
        engine/src/utils/openglWrapper/openglObjects/Vao.h
        engine/src/utils/openglWrapper/shader/ShaderProgram.cpp
        engine/src/utils/openglWrapper/shader/ShaderProgram.h
        engine/src/renderer/primitives/CubeFactory.cpp
        engine/src/renderer/primitives/CubeFactory.h
        engine/src/utils/openglWrapper/shader/Uniform.cpp
        engine/src/utils/openglWrapper/shader/Uniform.h
        engine/src/utils/openglWrapper/shader/UniformValue.cpp
        engine/src/utils/openglWrapper/shader/UniformValue.h
        engine/src/layer/Scene.cpp
        engine/src/layer/Scene.h
        engine/src/loader/AssetLoader.cpp
        engine/src/loader/AssetLoader.h
        engine/src/loader/assets/AssetTypes.h
        engine/src/loader/assets/AssetRequests.h
        engine/src/loader/assets/AssetRequests.cpp
        engine/src/loader/assets/RawAssetData.h
        engine/src/loader/assets/AssetFormatters.h
        engine/src/loader/textures/TextureUploader.cpp
        engine/src/loader/textures/TextureUploader.h
        engine/src/loader/textures/TextureImporter.cpp
        engine/src/loader/textures/TextureImporter.h
        engine/src/loader/textures/Texture2D.cpp
        engine/src/loader/textures/Texture2D.h
        engine/src/loader/models/ModelImporter.cpp
        engine/src/loader/models/ModelImporter.h
        engine/src/loader/models/ModelUploader.cpp
        engine/src/loader/models/ModelUploader.h
        engine/src/loader/models/Material.cpp
        engine/src/loader/models/Material.h
        engine/src/loader/assets/LoadedAssets.h
        engine/src/loader/models/Model.cpp
        engine/src/loader/models/Model.h
        engine/src/loader/models/MeshSection.cpp
        engine/src/loader/models/MeshSection.h
        engine/src/loader/assets/AssetManager.cpp
        engine/src/loader/assets/AssetManager.h
        engine/src/renderer/entities/PointLight.cpp
        engine/src/renderer/entities/PointLight.h
        engine/src/core/inputsOutputs/inputs/MouseButton.h
        engine/src/core/inputsOutputs/inputs/Mouse.cpp
        engine/src/core/inputsOutputs/inputs/Mouse.h
        engine/src/core/inputsOutputs/inputs/Keyboard.cpp
        engine/src/core/inputsOutputs/inputs/Keyboard.h
        engine/src/core/inputsOutputs/context/InputContextStack.cpp
        engine/src/core/inputsOutputs/context/InputContextStack.h
        engine/src/core/inputsOutputs/controller/CameraController.cpp
        engine/src/core/inputsOutputs/controller/CameraController.h
)
target_include_directories(Engine PUBLIC engine/src)
target_link_libraries(Engine PUBLIC OpenGL::GL glfw glad glm::glm imgui spdlog::spdlog tinyobjloader stb_image)

# --- Executable ---
add_executable(ColorRace
        game/src/main.cpp
        game/src/ColorRaceApp.cpp
        game/src/ColorRaceApp.h
        engine/src/renderer/model/RawModel.cpp
        engine/src/renderer/model/RawModel.h
        engine/src/renderer/entities/Entity.cpp
        engine/src/renderer/entities/Entity.h
        engine/src/renderer/shader/StaticShader.cpp
        engine/src/renderer/shader/StaticShader.h
        engine/src/renderer/entities/Camera.cpp
        engine/src/renderer/entities/Camera.h
        engine/src/ecs/EntityRegistry.cpp
        engine/src/ecs/EntityRegistry.h
        engine/src/ecs/Entity.cpp
        engine/src/ecs/Entity.h
        engine/src/ecs/ComponentPool.cpp
        engine/src/ecs/ComponentPool.h
        engine/src/ecs/standardComponents/TransformComponent.h
        engine/src/ecs/standardComponents/MeshComponent.h
        engine/src/ecs/EntitySystem.cpp
        engine/src/ecs/EntitySystem.h
        engine/src/renderer/RenderSystem.cpp
        engine/src/renderer/RenderSystem.h
        engine/src/renderer/RenderQueue.cpp
        engine/src/renderer/RenderQueue.h
        engine/src/renderer/MeshRenderSystem.cpp
        engine/src/renderer/MeshRenderSystem.h
        engine/src/renderer/MeshRenderer.cpp
        engine/src/renderer/MeshRenderer.h
        engine/src/layer/Layer.cpp
        engine/src/layer/Layer.h
        game/src/GameLayer.cpp
        game/src/GameLayer.h
        engine/src/layer/SceneManager.cpp
        engine/src/layer/SceneManager.h
        game/src/GameScene.cpp
        game/src/GameScene.h
        engine/src/core/inputsOutputs/context/InputContext.cpp
        engine/src/core/inputsOutputs/context/InputContext.h

)

target_link_libraries(ColorRace PRIVATE
        Engine
)