include(GNUInstallDirs)
include(ExternalProject)
include(ProcessorCount)

ProcessorCount(CPUS)

set(FMT_INSTALL_DIR             ${CMAKE_CURRENT_BINARY_DIR}/fmt)
# CMake 3.23+ puts CMAKE_LIBRARY_ARCHITECTURE into CMAKE_INSTALL_LIBDIR only if /usr/ is in CMAKE_INSTALL_PREFIX so we need to manually fix it
if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.23.0" AND CMAKE_INSTALL_LIBDIR MATCHES "/${CMAKE_LIBRARY_ARCHITECTURE}$")
	string(REGEX REPLACE "/${CMAKE_LIBRARY_ARCHITECTURE}$" "/" FMT_INSTALL_LIBDIR ${FMT_INSTALL_DIR}/${CMAKE_INSTALL_LIBDIR})
else()
	set(FMT_INSTALL_LIBDIR ${FMT_INSTALL_DIR}/${CMAKE_INSTALL_LIBDIR})
endif()
set(FMT_INCLUDE_DIR             ${FMT_INSTALL_DIR}/include)
set(FMT_INSTALLED_LIBRARY       ${FMT_INSTALL_LIBDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}fmt${CMAKE_STATIC_LIBRARY_SUFFIX})
set(FMT_INSTALLED_LIBRARY_DEBUG ${FMT_INSTALL_LIBDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}fmtd${CMAKE_STATIC_LIBRARY_SUFFIX})
set(FMT_LIBRARY                 ${FMT_INSTALL_LIBDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}pog_fmt${CMAKE_STATIC_LIBRARY_SUFFIX})

if(MSVC)
	set(FMT_BUILD_COMMAND ${CMAKE_COMMAND} --build . --config $<CONFIG> -- -m)
	set(FMT_INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config $<CONFIG>)
else()
	set(FMT_BUILD_COMMAND ${CMAKE_COMMAND} --build . -- -j${CPUS})
	set(FMT_INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install)
endif()

ExternalProject_Add(
	fmt-dep
	PREFIX "fmt"
	SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/fmt"
	CMAKE_ARGS
		-DCMAKE_INSTALL_PREFIX=${FMT_INSTALL_DIR}
		-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
		-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}
		-DCMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE}
		-DCMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}
		-DCMAKE_POSITION_INDEPENDENT_CODE=${POG_PIC}
		-DFMT_TEST=OFF
		-DFMT_DOC=OFF
	BUILD_COMMAND
		${FMT_BUILD_COMMAND}
	INSTALL_COMMAND
		${FMT_INSTALL_COMMAND}
)

ExternalProject_Add_Step(
	fmt-dep rename
	DEPENDEES install
	COMMAND ${CMAKE_COMMAND} -E rename $<IF:$<CONFIG:Debug>,${FMT_INSTALLED_LIBRARY_DEBUG},${FMT_INSTALLED_LIBRARY}> ${FMT_LIBRARY}
)

add_library(fmt::fmt STATIC IMPORTED GLOBAL)
set_target_properties(fmt::fmt PROPERTIES
	INTERFACE_INCLUDE_DIRECTORIES "${FMT_INCLUDE_DIR}"
	IMPORTED_LOCATION "${FMT_LIBRARY}"
)
add_dependencies(fmt::fmt fmt-dep)

install(
	FILES ${FMT_LIBRARY}
	DESTINATION ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}
)
install(
	DIRECTORY ${FMT_INCLUDE_DIR}/fmt/
	DESTINATION ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}/pog/fmt
)
