cmake_minimum_required(VERSION 3.20)

project(vectorail-core VERSION 0.1.0 LANGUAGES CXX)

include(GNUInstallDirs)
include(CMakePackageConfigHelpers)
include(FetchContent)

find_package(OpenGL REQUIRED)

set(VECTORAIL_CORE_FETCHED_DEPENDENCIES OFF)

find_package(SDL3 CONFIG QUIET)
if(NOT TARGET SDL3::SDL3)
    set(SDL_INSTALL OFF CACHE BOOL "" FORCE)
    FetchContent_Declare(SDL3
        GIT_REPOSITORY https://github.com/libsdl-org/SDL.git
        GIT_TAG main
    )
    FetchContent_MakeAvailable(SDL3)
    set(VECTORAIL_CORE_FETCHED_DEPENDENCIES ON)
endif()

find_package(glm CONFIG QUIET)
if(NOT TARGET glm::glm)
    FetchContent_Declare(glm
        GIT_REPOSITORY https://github.com/g-truc/glm.git
        GIT_TAG master
    )
    FetchContent_MakeAvailable(glm)
    set(VECTORAIL_CORE_FETCHED_DEPENDENCIES ON)
endif()

FetchContent_Declare(stb
    GIT_REPOSITORY https://github.com/nothings/stb.git
    GIT_TAG 2c980bb59875b0d32144a71867fbdebb2f77cd20
)
FetchContent_MakeAvailable(stb)

if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR AND
   NOT VECTORAIL_CORE_FETCHED_DEPENDENCIES)
    set(VECTORAIL_CORE_INSTALL_DEFAULT ON)
else()
    set(VECTORAIL_CORE_INSTALL_DEFAULT OFF)
endif()
option(VECTORAIL_CORE_INSTALL "Generate VectorailCore install rules"
    ${VECTORAIL_CORE_INSTALL_DEFAULT})

add_library(vectorail-core
    src/DdsTexture.cpp
    src/PngTexture.cpp
    src/Shader.cpp
    src/Spline.cpp
    src/gl_loader.cpp
)
add_library(Vectorail::Core ALIAS vectorail-core)

target_compile_features(vectorail-core PUBLIC cxx_std_23)
target_include_directories(vectorail-core
    PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
        $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
    PRIVATE
        ${stb_SOURCE_DIR}
)
target_link_libraries(vectorail-core
    PUBLIC
        SDL3::SDL3
        OpenGL::GL
        glm::glm
)

set_target_properties(vectorail-core PROPERTIES
    EXPORT_NAME Core
    VERSION ${PROJECT_VERSION}
    SOVERSION ${PROJECT_VERSION_MAJOR}
)

if(VECTORAIL_CORE_INSTALL)
    install(TARGETS vectorail-core
        EXPORT VectorailCoreTargets
        ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
        LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
        INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
    )
    install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
    install(EXPORT VectorailCoreTargets
        FILE VectorailCoreTargets.cmake
        NAMESPACE Vectorail::
        DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/VectorailCore
    )

    configure_package_config_file(
        cmake/VectorailCoreConfig.cmake.in
        ${CMAKE_CURRENT_BINARY_DIR}/VectorailCoreConfig.cmake
        INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/VectorailCore
    )
    write_basic_package_version_file(
        ${CMAKE_CURRENT_BINARY_DIR}/VectorailCoreConfigVersion.cmake
        VERSION ${PROJECT_VERSION}
        COMPATIBILITY SameMajorVersion
    )
    install(FILES
        ${CMAKE_CURRENT_BINARY_DIR}/VectorailCoreConfig.cmake
        ${CMAKE_CURRENT_BINARY_DIR}/VectorailCoreConfigVersion.cmake
        DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/VectorailCore
    )
endif()
