cmake_minimum_required(VERSION 3.10)
project(NBEngine VERSION 0.1.0 LANGUAGES C CXX)

cmake_policy(SET CMP0135 NEW)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

include(GNUInstallDirs)
include(CMakePackageConfigHelpers)
include(CMakeDependentOption)

function(toAbsolutePath SETVAR PATHS)
    set(PATHS ${PATHS} ${ARGN})
    set(RET_VAL "")
    foreach(FILE ${PATHS})
        get_filename_component(TMP
            ${FILE}
            REALPATH
        )
        list(
            APPEND
            RET_VAL
            ${TMP}
        )
    endforeach()
    set(${SETVAR} ${RET_VAL} PARENT_SCOPE)
endfunction()

if(CMAKE_BUILD_TYPE STREQUAL "Release")
    message(STATUS "Targeting Release build")
elseif(CMAKE_BUILD_TYPE STREQUAL "Debug")
    message(STATUS "Targeting Debug build")
    set(NB_DEBUG_BUILD ON)
    add_compile_definitions(_NB_BUILD_DEBUG)
endif()

cmake_dependent_option(NB_LOGGING 
    "Creates a default logger and automatically logs with code locations."
    ON
    NB_DEBUG_BUILD
    OFF
)
cmake_dependent_option(NB_BUILD_TESTS
    "Build unit tests"
    ON
    NB_DEBUG_BUILD
    OFF
)
cmake_dependent_option(NB_BUILD_DOCS
    "Build documentation"
    ON
    NB_DEBUG_BUILD
    OFF
)
cmake_dependent_option(NBENGINE_INSTALL
    "Install NBEngine"
    ON
    NB_DEBUG_BUILD
    OFF
)
cmake_dependent_option(NB_MONITOR_OPENGL_CALLS
    "Monitors every OpenGL call for errors"
    ON
    NB_DEBUG_BUILD
    OFF
)


if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
    message(STATUS "Building for Windows")
    set(NB_TARGET_WINDOWS ON)
elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
    message(STATUS "Building for Linux")
    set(NB_TARGET_LINUX ON)
endif()

if(NB_BUILD_TESTS)
    message(STATUS "Building tests")
    enable_testing()
    include(FetchContent)
    FetchContent_Declare(
        gtest
        URL https://github.com/google/googletest/archive/refs/heads/main.zip
    )
    if (WIN32)
        set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
        FetchContent_MakeAvailable(gtest)
    endif()
    set(GTEST_COLOR ON)
endif()

if (NB_LOGGING)
    message(STATUS "Building with automatic logging")
    add_compile_definitions(_NB_AUTOLOG)
    add_compile_definitions(_NB_CODE_ERROR_LOCATIONS)
endif()

if(NB_TARGET_WINDOWS)
    add_compile_definitions(_NB_TARGET_WINDOWS)
endif()
if(NB_TARGET_LINUX)
    add_compile_definitions(_NB_TARGET_LINUX)
endif()

get_filename_component(NBENGINE_ROOT ${CMAKE_CURRENT_LIST_DIR} ABSOLUTE)

add_subdirectory(./engine ${PROJECT_BINARY_DIR}/${CMAKE_BUILD_TYPE})

# Toggle
set(NB_REBUILD_DOCS)

if (NB_BUILD_DOCS)
    add_subdirectory(./docs)
endif()

include(CMakePackageConfigHelpers)
configure_package_config_file(
    "NBEngineConfig.cmake.in"
    "${PROJECT_BINARY_DIR}/cmake/NBEngineConfig.cmake"
    INSTALL_DESTINATION ${CMAKE_INSTALL_PREFIX}/cmake
    PATH_VARS CMAKE_INSTALL_LIBDIR
)
write_basic_package_version_file(
    "${PROJECT_BINARY_DIR}/cmake/NBEngineConfigVersion.cmake"
    COMPATIBILITY AnyNewerVersion 
)

if (NBENGINE_INSTALL)
    include(GNUInstallDirs)
    install(FILES
        "${PROJECT_BINARY_DIR}/cmake/NBEngineConfig.cmake"
        "${PROJECT_BINARY_DIR}/cmake/NBEngineConfigVersion.cmake"
        DESTINATION "${CMAKE_INSTALL_PREFIX}/cmake"
    )
endif()
