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

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
	set(CMAKE_MODULE_PATH ${CMAKE_BINARY_DIR} ${CMAKE_MODULE_PATH})
	set(CMAKE_PREFIX_PATH ${CMAKE_BINARY_DIR} ${CMAKE_PREFIX_PATH})
	include( cmake/conan.cmake )

	execute_process( COMMAND ls ${CMAKE_BINARY_DIR} )

	conan_cmake_configure(
		REQUIRES
			opengl/system
			glfw/3.3.7
			glad/0.1.35
			glm/0.9.9.8
			spdlog/1.10.0
		GENERATORS 
			cmake_find_package_multi
		OPTIONS
			glad:gl_profile=core
			glad:gl_version=4.5
			glad:extensions="GL_ARB_get_program_binary"
	)
	foreach(TYPE ${CMAKE_CONFIGURATION_TYPES})
		conan_cmake_autodetect( settings BUILD_TYPE ${TYPE} )
		conan_cmake_install(
			PATH_OR_REFERENCE .
			BUILD missing
			REMOTE connancenter
			SETTINGS ${settings}
		)
	endforeach()

	execute_process( COMMAND ls ${CMAKE_BINARY_DIR} )

	# 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
##

set(FGGL_WAYLAND True)


include(GNUInstallDirs)

# depedencies


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

# extras
#add_subdirectory(tests)
add_subdirectory(demo)

##
# INSTALL PHASE
# see https://decovar.dev/blog/2021/03/08/cmake-cpp-library/
##
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}
)