
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})

find_package(PkgConfig REQUIRED)
find_package(OpenGL REQUIRED)
find_package(GLEW REQUIRED)

pkg_check_modules(TINYXML REQUIRED IMPORTED_TARGET tinyxml)

SET(GCC4_HEADERS
	${PROJECT_SOURCE_DIR}/Source/GCC4/Actors/Actor.h
	${PROJECT_SOURCE_DIR}/Source/GCC4/Actors/ActorComponent.h
	${PROJECT_SOURCE_DIR}/Source/GCC4/Actors/ActorFactory.h
	${PROJECT_SOURCE_DIR}/Source/GCC4/Actors/AudioComponent.h
	${PROJECT_SOURCE_DIR}/Source/GCC4/Actors/BaseScriptComponent.h
	${PROJECT_SOURCE_DIR}/Source/GCC4/Actors/RenderComponent.h
	${PROJECT_SOURCE_DIR}/Source/GCC4/Actors/ScriptComponentInterface.h
	${PROJECT_SOURCE_DIR}/Source/GCC4/Actors/TransformComponent.h
	${PROJECT_SOURCE_DIR}/Source/GCC4/Debugging/Logger.h
	${PROJECT_SOURCE_DIR}/Source/GCC4/EventManager/EventManager.h
	${PROJECT_SOURCE_DIR}/Source/GCC4/EventManager/EventManagerImpl.h
	${PROJECT_SOURCE_DIR}/Source/GCC4/EventManager/Events.h
	${PROJECT_SOURCE_DIR}/Source/GCC4/GameCode4/BaseGameLogic.h
	${PROJECT_SOURCE_DIR}/Source/GCC4/GameCode4/GameCode.h
	${PROJECT_SOURCE_DIR}/Source/GCC4/GameCode4/interfaces.h
	${PROJECT_SOURCE_DIR}/Source/GCC4/Graphics3D/Geometry.h
	${PROJECT_SOURCE_DIR}/Source/GCC4/Graphics3D/Lights.h
	${PROJECT_SOURCE_DIR}/Source/GCC4/Graphics3D/Material.h
	${PROJECT_SOURCE_DIR}/Source/GCC4/Graphics3D/Mesh.h
	${PROJECT_SOURCE_DIR}/Source/GCC4/Graphics3D/MovementController.h
	${PROJECT_SOURCE_DIR}/Source/GCC4/Graphics3D/OpenGLRenderer.h
	${PROJECT_SOURCE_DIR}/Source/GCC4/Graphics3D/Scene.h
	${PROJECT_SOURCE_DIR}/Source/GCC4/Graphics3D/SceneNodes.h
	${PROJECT_SOURCE_DIR}/Source/GCC4/Graphics3D/Shaders.h
	${PROJECT_SOURCE_DIR}/Source/GCC4/Graphics3D/Sky.h
	${PROJECT_SOURCE_DIR}/Source/GCC4/LUAScripting/LuaStateManager.h
	${PROJECT_SOURCE_DIR}/Source/GCC4/LUAScripting/ScriptEvent.h
	${PROJECT_SOURCE_DIR}/Source/GCC4/LUAScripting/ScriptExports.h
	${PROJECT_SOURCE_DIR}/Source/GCC4/LUAScripting/ScriptProcess.h
	${PROJECT_SOURCE_DIR}/Source/GCC4/LUAScripting/ScriptResource.h
	${PROJECT_SOURCE_DIR}/Source/GCC4/Mainloop/Initialization.h
	${PROJECT_SOURCE_DIR}/Source/GCC4/Mainloop/Process.h
	${PROJECT_SOURCE_DIR}/Source/GCC4/Multicore/CriticalSection.h
	${PROJECT_SOURCE_DIR}/Source/GCC4/ResourceCache/ResCache.h
	${PROJECT_SOURCE_DIR}/Source/GCC4/ResourceCache/XmlResource.h
	${PROJECT_SOURCE_DIR}/Source/GCC4/ResourceCache/ZipFile.h
	${PROJECT_SOURCE_DIR}/Source/GCC4/Unix/GameCodeStd.h
	${PROJECT_SOURCE_DIR}/Source/GCC4/UserInterface/HumanView.h
	${PROJECT_SOURCE_DIR}/Source/GCC4/Utilities/Dialogs.h
	${PROJECT_SOURCE_DIR}/Source/GCC4/Utilities/Math.h
	${PROJECT_SOURCE_DIR}/Source/GCC4/Utilities/String.h
	${PROJECT_SOURCE_DIR}/Source/GCC4/Utilities/templates.h
	${PROJECT_SOURCE_DIR}/Source/GCC4/Utilities/types.h
)

SET(GCC4_SOURCES
	${PROJECT_SOURCE_DIR}/Source/GCC4/Actors/Actor.cpp
	${PROJECT_SOURCE_DIR}/Source/GCC4/Actors/ActorFactory.cpp
	${PROJECT_SOURCE_DIR}/Source/GCC4/Actors/AudioComponent.cpp
	${PROJECT_SOURCE_DIR}/Source/GCC4/Actors/BaseScriptComponent.cpp
	${PROJECT_SOURCE_DIR}/Source/GCC4/Actors/RenderComponent.cpp
	${PROJECT_SOURCE_DIR}/Source/GCC4/Actors/TransformComponent.cpp
	${PROJECT_SOURCE_DIR}/Source/GCC4/Debugging/Logger.cpp
	${PROJECT_SOURCE_DIR}/Source/GCC4/EventManager/EventManager.cpp
	${PROJECT_SOURCE_DIR}/Source/GCC4/EventManager/EventManagerImpl.cpp
	${PROJECT_SOURCE_DIR}/Source/GCC4/EventManager/Events.cpp
	${PROJECT_SOURCE_DIR}/Source/GCC4/GameCode4/BaseGameLogic.cpp
	${PROJECT_SOURCE_DIR}/Source/GCC4/GameCode4/GameCode.cpp
	${PROJECT_SOURCE_DIR}/Source/GCC4/GameCode4/GameCode4.cpp
	${PROJECT_SOURCE_DIR}/Source/GCC4/Graphics3D/Geometry.cpp
	${PROJECT_SOURCE_DIR}/Source/GCC4/Graphics3D/Lights.cpp
	${PROJECT_SOURCE_DIR}/Source/GCC4/Graphics3D/Material.cpp
	${PROJECT_SOURCE_DIR}/Source/GCC4/Graphics3D/Mesh.cpp
	${PROJECT_SOURCE_DIR}/Source/GCC4/Graphics3D/MovementController.cpp
	${PROJECT_SOURCE_DIR}/Source/GCC4/Graphics3D/OpenGLRenderer.cpp
	${PROJECT_SOURCE_DIR}/Source/GCC4/Graphics3D/Scene.cpp
	${PROJECT_SOURCE_DIR}/Source/GCC4/Graphics3D/SceneNodes.cpp
	${PROJECT_SOURCE_DIR}/Source/GCC4/Graphics3D/Shaders.cpp
	${PROJECT_SOURCE_DIR}/Source/GCC4/Graphics3D/Sky.cpp
	${PROJECT_SOURCE_DIR}/Source/GCC4/LUAScripting/LuaStateManager.cpp
	${PROJECT_SOURCE_DIR}/Source/GCC4/LUAScripting/ScriptEvent.cpp
	${PROJECT_SOURCE_DIR}/Source/GCC4/LUAScripting/ScriptExports.cpp
	${PROJECT_SOURCE_DIR}/Source/GCC4/LUAScripting/ScriptProcess.cpp
	${PROJECT_SOURCE_DIR}/Source/GCC4/LUAScripting/ScriptResource.cpp
	${PROJECT_SOURCE_DIR}/Source/GCC4/Mainloop/Initialization.cpp
	${PROJECT_SOURCE_DIR}/Source/GCC4/Mainloop/Process.cpp
	${PROJECT_SOURCE_DIR}/Source/GCC4/ResourceCache/ResCache.cpp
	${PROJECT_SOURCE_DIR}/Source/GCC4/ResourceCache/XmlResource.cpp
	${PROJECT_SOURCE_DIR}/Source/GCC4/ResourceCache/ZipFile.cpp
	${PROJECT_SOURCE_DIR}/Source/GCC4/Unix/GameCodeStd.cpp
	${PROJECT_SOURCE_DIR}/Source/GCC4/UserInterface/HumanView.cpp
	${PROJECT_SOURCE_DIR}/Source/GCC4/Utilities/Dialogs.cpp
	${PROJECT_SOURCE_DIR}/Source/GCC4/Utilities/Math.cpp
	${PROJECT_SOURCE_DIR}/Source/GCC4/Utilities/String.cpp
)

add_library(gcc4 ${GCC4_HEADERS} ${GCC4_SOURCES})

target_link_libraries(gcc4 PRIVATE PkgConfig::TINYXML)
target_link_libraries(gcc4 PRIVATE GLEW::GLEW OpenGL::GL SDL3::SDL3 SDL3_image::SDL3_image)
target_link_libraries(gcc4 PRIVATE imgui)
target_link_libraries(gcc4 PUBLIC sol2::sol2 lua)
target_link_libraries(gcc4 PUBLIC fastdelegate)
target_link_libraries(gcc4 PUBLIC assimp)

# target_include_directories(gcc4 PUBLIC ${LUA_INCLUDE_DIR})

SET(TEAPOT_HEADERS
	${PROJECT_SOURCE_DIR}/Source/GCC4/GameCode4/GameCode.h
	${PROJECT_SOURCE_DIR}/Source/TeapotWars/TeapotEvents.h
	${PROJECT_SOURCE_DIR}/Source/TeapotWars/TeapotWarsView.h
	${PROJECT_SOURCE_DIR}/Source/TeapotWars/Unix/TeapotWars.h
	${PROJECT_SOURCE_DIR}/Source/TeapotWars/Unix/TeapotWarsStd.h
)

SET(TEAPOT_SOURCES
	${PROJECT_SOURCE_DIR}/Source/TeapotWars/TeapotEvents.cpp
	${PROJECT_SOURCE_DIR}/Source/TeapotWars/TeapotWars.cpp
	${PROJECT_SOURCE_DIR}/Source/TeapotWars/TeapotWarsView.cpp
)

add_executable(teapot-wars ${TEAPOT_HEADERS} ${TEAPOT_SOURCES} ${GCC4_HEADERS})

target_link_libraries(teapot-wars PRIVATE 
	gcc4
	GLEW::GLEW
	OpenGL::GL
	SDL3::SDL3
	SDL3_image::SDL3_image
	imgui
	${CMAKE_DL_LIBS}
)

target_compile_options(gcc4 PRIVATE -Wall -Wextra -Wpedantic)
target_compile_features(gcc4 PUBLIC cxx_std_20)

target_compile_options(teapot-wars PRIVATE -Wall -Wextra -Wpedantic)
target_compile_features(teapot-wars PUBLIC cxx_std_20)

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})

add_custom_command(
    TARGET teapot-wars PRE_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_directory
                ${PROJECT_SOURCE_DIR}/Game
                ${CMAKE_BINARY_DIR}/)

add_custom_command(
    TARGET teapot-wars PRE_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_directory
                ${PROJECT_SOURCE_DIR}/Assets
                ${CMAKE_BINARY_DIR}/Assets)