cmake_minimum_required(VERSION 3.20)

project(cyrusengine_imperial VERSION 0.1.0 LANGUAGES C CXX)

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

option(CYRUSENGINE_BUILD_PLAYGROUND "Build the playground executable" ON)

find_package(OpenGL REQUIRED)
find_package(GLEW REQUIRED)
find_package(Threads REQUIRED)
find_package(PkgConfig REQUIRED)
pkg_check_modules(GLFW3 REQUIRED IMPORTED_TARGET glfw3)

file(GLOB_RECURSE CYRUSENGINE_SOURCES CONFIGURE_DEPENDS
    "${PROJECT_SOURCE_DIR}/src/graphics/*.cpp"
    "${PROJECT_SOURCE_DIR}/src/ecs/*.cpp"
    "${PROJECT_SOURCE_DIR}/src/physics/*.cpp"
    "${PROJECT_SOURCE_DIR}/src/3rdparty/Box2D/*.cpp"
)

list(APPEND CYRUSENGINE_SOURCES
    "${PROJECT_SOURCE_DIR}/src/Base.cpp"
    "${PROJECT_SOURCE_DIR}/src/CyrusEngine.cpp"
    "${PROJECT_SOURCE_DIR}/src/3rdparty/freetype2/freetype_amalgam.c"
)

file(GLOB STB_SOURCES CONFIGURE_DEPENDS
    "${PROJECT_SOURCE_DIR}/src/3rdparty/stb_collection/*.c"
)
list(APPEND CYRUSENGINE_SOURCES ${STB_SOURCES})

add_library(cyrusengine STATIC ${CYRUSENGINE_SOURCES})
add_library(CyrusEngine::CyrusEngine ALIAS cyrusengine)

target_compile_features(cyrusengine PUBLIC cxx_std_23)
target_include_directories(cyrusengine PUBLIC
    "${PROJECT_SOURCE_DIR}/src"
    "${PROJECT_SOURCE_DIR}/src/3rdparty"
    "${PROJECT_SOURCE_DIR}/src/3rdparty/freetype2/include"
    "${PROJECT_SOURCE_DIR}/src/3rdparty/entt"
    "${PROJECT_SOURCE_DIR}/src/3rdparty/glm"
)
target_link_libraries(cyrusengine PUBLIC
    OpenGL::GL
    GLEW::GLEW
    PkgConfig::GLFW3
)

if(CYRUSENGINE_BUILD_PLAYGROUND)
    pkg_check_modules(SNDFILE REQUIRED IMPORTED_TARGET sndfile)
    pkg_check_modules(VORBISFILE REQUIRED IMPORTED_TARGET vorbisfile)
    pkg_check_modules(PORTAUDIO REQUIRED IMPORTED_TARGET portaudio-2.0)

    file(GLOB PLAYGROUND_SOURCES CONFIGURE_DEPENDS
        "${PROJECT_SOURCE_DIR}/examples/playground/*.cpp"
    )

    add_executable(playground ${PLAYGROUND_SOURCES})
    target_compile_features(playground PRIVATE cxx_std_23)
    target_include_directories(playground PRIVATE
        "${PROJECT_SOURCE_DIR}/examples"
        "${PROJECT_SOURCE_DIR}/src"
        "${PROJECT_SOURCE_DIR}/src/3rdparty"
        "${PROJECT_SOURCE_DIR}/src/3rdparty/freetype2/include"
        "${PROJECT_SOURCE_DIR}/src/3rdparty/entt"
        "${PROJECT_SOURCE_DIR}/src/3rdparty/glm"
        "${PROJECT_SOURCE_DIR}/src/3rdparty/microui"
    )
    target_link_libraries(playground PRIVATE
        CyrusEngine::CyrusEngine
        PkgConfig::SNDFILE
        PkgConfig::VORBISFILE
        PkgConfig::PORTAUDIO
        Threads::Threads
        ${CMAKE_DL_LIBS}
    )

endif()