cmake_minimum_required(VERSION 3.16)
set(namespace "fggl")

set(CMAKE_CXX_STANDARD 20)

option(FGGL_CONAN "Should we use conan to find missing dependencies?" ON)
set(CONAN_BUILD_TYPE "Debug")

# Define the project
project(fggl
	VERSION 0.1
	DESCRIPTION ""
	HOMEPAGE_URL ""
	LANGUAGES CXX)

if (CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)

	# slightly cleaner conan support
    if ( FGGL_CONAN )
        set(CMAKE_MODULE_PATH ${CMAKE_BINARY_DIR} ${CMAKE_MODULE_PATH})
        set(CMAKE_PREFIX_PATH ${CMAKE_BINARY_DIR} ${CMAKE_PREFIX_PATH})
        include( ${CMAKE_CURRENT_SOURCE_DIR}/cmake/conan.cmake )

        conan_cmake_configure(
            REQUIRES
                assimp/5.2.2
                opengl/system
                glfw/3.3.7
                glad/0.1.35
                glm/0.9.9.8
                spdlog/1.10.0
                freetype/2.11.1
                bullet3/3.22a
                openal/1.21.1
                yaml-cpp/0.7.0
            GENERATORS 
                cmake_find_package
                cmake_find_package_multi
            OPTIONS
                glfw:shared=True
                glad:gl_profile=core
                glad:gl_version=4.5
                glad:extensions="GL_ARB_get_program_binary,GL_ARB_shading_language_include"
        )

        if ( CMAKE_CONFIGURATION_TYPES )
            foreach(TYPE ${CMAKE_CONFIGURATION_TYPES})
                conan_cmake_autodetect( settings BUILD_TYPE ${TYPE} )
                conan_cmake_install(
                    PATH_OR_REFERENCE .
                    BUILD missing
                    SETTINGS ${settings}
                )
            endforeach()
        else()
            conan_cmake_autodetect( settings BUILD_TYPE ${TYPE} )
            conan_cmake_install(
                PATH_OR_REFERENCE .
                BUILD missing
                SETTINGS ${settings}
            )
        endif()
    endif()

	# testing support
	include(CTest)

	# Documentation support
	find_package(Doxygen)
	if (Doxygen_FOUND)
		add_subdirectory( docs )
	else()
		message(STATUS "Doxygen not found, not building docs")
	endif()

endif()


set(CMAKE_EXPORT_COMPILE_COMMANDS ON)


##
# begin windows support
##
if(MSVC)
  target_compile_options(${PROJECT_NAME} PUBLIC "/ZI")
  target_link_options(${PROJECT_NAME} PUBLIC "/INCREMENTAL")
endif()
##
# end windows support
##

# engine
#add_subdirectory(vendor/imgui/)
add_subdirectory(fggl)

## G++ enable insane checks
target_compile_options( ${PROJECT_NAME} PRIVATE -Wall -fno-strict-aliasing -fno-strict-overflow )



# extras
#add_subdirectory(tests)
add_subdirectory(demo)

##
# INSTALL PHASE
# see https://decovar.dev/blog/2021/03/08/cmake-cpp-library/
##
include(GNUInstallDirs)

file(GLOB_RECURSE public_headers
	${PROJECT_SOURCE_DIR}/include/${PROJECT_NAME}/*.hpp
	${PROJECT_SOURCE_DIR}/include/${PROJECT_NAME}/*.h
)

#include(CMakePrintHelpers)

# Structure preserving header macro
foreach(header ${public_headers})
    file(RELATIVE_PATH header_file_path "${CMAKE_CURRENT_SOURCE_DIR}/include" "${header}")
    get_filename_component(header_directory_path "${header_file_path}" DIRECTORY)
    install(
        FILES ${header}
        DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${header_directory_path}"
    )
endforeach()

set_target_properties(${PROJECT_NAME} PROPERTIES DEBUG_POSTFIX "d")

# generate and install export file
install(EXPORT "${PROJECT_NAME}Targets"
    FILE "${PROJECT_NAME}Targets.cmake"
    NAMESPACE ${namespace}::
    DESTINATION cmake
)

include(CMakePackageConfigHelpers)

# generate the version file for the config file
write_basic_package_version_file(
    "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
    VERSION "${version}"
    COMPATIBILITY AnyNewerVersion
)
# create config file
configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in
    "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
    INSTALL_DESTINATION cmake
)
# install config files
install(FILES
    "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
    "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
    DESTINATION cmake
)
# generate the export targets for the build tree
export(EXPORT "${PROJECT_NAME}Targets"
    FILE "${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}Targets.cmake"
    NAMESPACE ${namespace}::
)

install(TARGETS ${PROJECT_NAME}
  EXPORT ${PROJECT_NAME}Targets
  PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}
  INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
)