set(FetchContent_INCLUDED FALSE)
if(NOT WIN32)
	find_package(Git QUIET)
	find_package(Subversion QUIET)
	# no FetchContent until 3.11
	if((NOT ${CMAKE_VERSION} VERSION_LESS "3.11.0") AND (Git_FOUND OR Subversion_FOUND))
		include(FetchContent)
		set(FetchContent_INCLUDED TRUE)
	endif()
endif()

function(FetchDependency name)
	set(value_args
		DIR
		
		GIT_REPOSITORY
		GIT_TAG
		GIT_UNSHALLOW
		
		SVN_REPOSITORY
		SVN_REVISION
		
		FILE_DOWNLOAD
		FILE_SUBDIR
	)
	set(multi_value_args
		FETCH_PRIORITY
	)
	cmake_parse_arguments(ARGS "" "${value_args}" "${multi_value_args}" ${ARGN})
	
	if(NOT ARGS_DIR)
		set(ARGS_DIR ${name})
	endif()
	if(NOT ARGS_FETCH_PRIORITY)
		set(ARGS_FETCH_PRIORITY git svn file)
	endif()
	list(APPEND ARGS_FETCH_PRIORITY none)
	
	set(${name}_BIN ${VGM_BINARY_DIR}/dependencies/${ARGS_DIR})
	set(${name}_BIN ${${name}_BIN} PARENT_SCOPE)
	
	if(${name}_PATH)
		if(IS_DIRECTORY "${${name}_PATH}")
			set(${name}_SOURCE "(local path)" PARENT_SCOPE)
		else()
			message(FATAL_ERROR "The provided path to ${ARGS_DIR} does not exist (Use ${name}_PATH)")
		endif()
	elseif(FetchContent_INCLUDED AND ((Subversion_FOUND AND ARGS_SVN_REPOSITORY) OR (Git_FOUND AND ARGS_GIT_REPOSITORY) OR ((NOT ${CMAKE_VERSION} VERSION_LESS "3.18.0") AND ARGS_FILE_DOWNLOAD)))
		set(${name}_PATH ${VGM_SOURCE_DIR}/dependencies/${ARGS_DIR})
		set(${name}_PATH ${${name}_PATH} PARENT_SCOPE)
		set(${name}_SOURCE "(download)" PARENT_SCOPE)
		
		foreach(CURRENT_FETCH ${ARGS_FETCH_PRIORITY})
			if(CURRENT_FETCH STREQUAL "git" AND Git_FOUND AND ARGS_GIT_REPOSITORY)
				if(ARGS_GIT_UNSHALLOW)
					set(shallow OFF)
				else()
					set(shallow ON)
				endif()
				FetchContent_Declare(${name}_FETCH
					GIT_REPOSITORY ${ARGS_GIT_REPOSITORY}
					SOURCE_DIR ${${name}_PATH}
					BINARY_DIR ${${name}_BIN}
					SUBBUILD_DIR ${${name}_BIN}-sub
					GIT_TAG ${ARGS_GIT_TAG}
					GIT_SHALLOW ${shallow}
				)
				FetchContent_GetProperties(${name}_FETCH)
				if(NOT ${name}_FETCH_POPULATED)
					message("Downloading ${ARGS_DIR} (git)...")
					FetchContent_Populate(${name}_FETCH)
				endif()
				break()
				
			elseif(CURRENT_FETCH STREQUAL "svn" AND Subversion_FOUND AND ARGS_SVN_REPOSITORY)
				FetchContent_Declare(${name}_FETCH
					SVN_REPOSITORY ${ARGS_SVN_REPOSITORY}
					SOURCE_DIR ${${name}_PATH}
					BINARY_DIR ${${name}_BIN}
					SUBBUILD_DIR ${${name}_BIN}-sub
					SVN_REVISION ${ARGS_SVN_REVISION}
				)
				FetchContent_GetProperties(${name}_FETCH)
				if(NOT ${name}_FETCH_POPULATED)
					message("Downloading ${ARGS_DIR} (svn)...")
					FetchContent_Populate(${name}_FETCH)
				endif()
				break()
				
			elseif(CURRENT_FETCH STREQUAL "file" AND (NOT ${CMAKE_VERSION} VERSION_LESS "3.18.0") AND ARGS_FILE_DOWNLOAD)
				# no ARCHIVE_EXTRACT until 3.18
				string(REGEX REPLACE ".*/" "" FILE ${ARGS_FILE_DOWNLOAD})
				if(NOT EXISTS ${${name}_PATH}/${FILE})
					message("Downloading ${ARGS_DIR} (file)...")
					file(DOWNLOAD
						${ARGS_FILE_DOWNLOAD}
						${${name}_PATH}/${FILE}
					)
					file(SIZE ${${name}_PATH}/${FILE} FILE_SIZE)
					if(FILE_SIZE EQUAL 0)
						message("The download of ${ARGS_DIR} (file) failed")
						continue()
					endif()
					file(ARCHIVE_EXTRACT
						INPUT ${${name}_PATH}/${FILE}
						DESTINATION ${${name}_PATH}
					)
				endif()
				if(ARGS_FILE_SUBDIR)
					set(${name}_PATH ${${name}_PATH}/${ARGS_FILE_SUBDIR} PARENT_SCOPE)
				endif()
				break()
			elseif(CURRENT_FETCH STREQUAL "none")
				set(${name}_PATH "" PARENT_SCOPE)
				set(USE_${name} OFF PARENT_SCOPE)
			endif()
		endforeach()
	else()
		set(${name}_PATH "" PARENT_SCOPE)
		set(USE_${name} OFF PARENT_SCOPE)
	endif()
endfunction()