if (NOT DEFINED BLIT_ONCE)
	set(BLIT_ONCE TRUE)

	set(CMAKE_CXX_STANDARD 14)
	set(CMAKE_CXX_EXTENSIONS OFF)

	if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
		set(CMAKE_BUILD_TYPE "Release")
	endif()
	
	if(WIN32)
		add_definitions("-DWIN32")
	endif()

	add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/32blit 32blit)

	find_package(PythonInterp 3 REQUIRED)

	# tool paths
	set(ASSET_PACKER ${CMAKE_CURRENT_LIST_DIR}/tools/asset-packer)
	set(SPRITE_BUILDER ${CMAKE_CURRENT_LIST_DIR}/tools/sprite-builder)
	set(MAP_BUILDER ${CMAKE_CURRENT_LIST_DIR}/tools/map-builder)

	function(pack_sprites FILENAME TYPE OUT_PATH)
		# TODO: this will break if someone passes the same name in different subdirs
		get_filename_component(BASE_NAME ${FILENAME} NAME)
		add_custom_command(
			OUTPUT ${BASE_NAME}.blit
			COMMAND ${PYTHON_EXECUTABLE} ${SPRITE_BUILDER} --out ${CMAKE_CURRENT_BINARY_DIR}/${BASE_NAME}.blit ${TYPE} ${FILENAME}
			DEPENDS ${FILENAME} ${SPRITE_BUILDER}
		)

		set(${OUT_PATH} ${CMAKE_CURRENT_BINARY_DIR}/${BASE_NAME}.blit PARENT_SCOPE)
	endfunction()

	function(pack_map FILENAME TYPE OUT_PATH)
		get_filename_component(BASE_NAME ${FILENAME} NAME)
		add_custom_command(
			OUTPUT ${BASE_NAME}.blit
			COMMAND ${PYTHON_EXECUTABLE} ${MAP_BUILDER} ${TYPE} --force --out ${CMAKE_CURRENT_BINARY_DIR}/${BASE_NAME}.blit ${FILENAME}
			DEPENDS ${FILENAME} ${MAP_BUILDER} ${TOOL_TILED}
		)

		set(${OUT_PATH} ${CMAKE_CURRENT_BINARY_DIR}/${BASE_NAME}.blit PARENT_SCOPE)
	endfunction()

	function (blit_assets_yaml TARGET FILE)
		# cause cmake to reconfigure whenever the asset list changes
		set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${FILE})

		# get the inputs/outputs for the asset tool (at configure time)
		execute_process(COMMAND ${PYTHON_EXECUTABLE} -m ttblit --debug cmake --config ${CMAKE_CURRENT_SOURCE_DIR}/${FILE} --output ${CMAKE_CURRENT_BINARY_DIR} --cmake ${CMAKE_CURRENT_BINARY_DIR}/assets.cmake)
		include(${CMAKE_CURRENT_BINARY_DIR}/assets.cmake)

		# do asset packing (at build time)
		add_custom_command(
			OUTPUT ${ASSET_OUTPUTS}
			COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && ${PYTHON_EXECUTABLE} -m ttblit --debug  pack --force --config ${CMAKE_CURRENT_SOURCE_DIR}/${FILE} --output ${CMAKE_CURRENT_BINARY_DIR}
			DEPENDS ${ASSET_DEPENDS} ${CMAKE_CURRENT_SOURCE_DIR}/${FILE}
		)

		# add the outputs as dependencies of the project (also compile any cpp files)
		target_sources(${TARGET} PRIVATE ${ASSET_OUTPUTS})
		target_include_directories(${TARGET} PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
	endfunction()

	function (blit_assets TARGET)
		set(ASSET_TYPE "")
		set(ASSET_FILES)

		foreach(ARG IN LISTS ARGN)
			# set asset type
			if(ARG STREQUAL "RAW" OR ARG STREQUAL "SPRITE_PACKED" OR ARG STREQUAL "SPRITE_RAW" OR ARG STREQUAL "MAP_TILED2BIN")
				set(ASSET_TYPE ${ARG})
				continue()
			elseif(ASSET_TYPE STREQUAL "")
				message(FATAL_ERROR "No asset type specified")
			endif()

			set(ASSET_PATH ${CMAKE_CURRENT_SOURCE_DIR}/${ARG})

			if(ASSET_TYPE STREQUAL "SPRITE_PACKED")
				pack_sprites(${ASSET_PATH} packed ASSET_PATH)
			elseif(ASSET_TYPE STREQUAL "SPRITE_RAW")
				pack_sprites(${ASSET_PATH} raw ASSET_PATH)
			elseif(ASSET_TYPE STREQUAL "MAP_TILED2BIN")
				pack_map(${ASSET_PATH} tiled2bin ASSET_PATH)
			endif()

			list(APPEND ASSET_FILES ${ASSET_PATH})
		endforeach()

		set(PACKER_ARGS)
		set(PACKER_OUTPUTS assets.bin assets.cpp assets.hpp)

		if(NOT CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
			set(PACKER_ARGS --inline-data)
			set(PACKER_OUTPUTS assets.cpp assets.hpp)
		endif()

		add_custom_command(
			OUTPUT ${PACKER_OUTPUTS}
			COMMAND ${PYTHON_EXECUTABLE} ${ASSET_PACKER} --base-path ${CMAKE_CURRENT_SOURCE_DIR} --base-path ${CMAKE_CURRENT_BINARY_DIR} ${PACKER_ARGS} ${ASSET_FILES}
			DEPENDS ${ASSET_FILES} ${ASSET_PACKER}
		)

		target_sources(${TARGET} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/assets.cpp)
		target_include_directories(${TARGET} PRIVATE ${CMAKE_CURRENT_BINARY_DIR})

		if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
			add_custom_command(
				COMMAND ${CMAKE_LINKER} -r -b binary -o assets.bin.o assets.bin
				COMMAND ${CMAKE_OBJCOPY} --rename-section .data=.rodata,alloc,load,readonly,data,contents assets.bin.o assets.bin.o
				OUTPUT assets.bin.o
				DEPENDS assets.bin
			)

			target_sources(${TARGET} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/assets.bin.o)
		endif()
	endfunction()

	if (${CMAKE_SYSTEM_NAME} STREQUAL Generic)
		set(FLASH_PORT "AUTO" CACHE STRING "Port to use for flash")

		# attempt to find the upload tool
		find_program(32BLIT_TOOL 32Blit PATHS
			${CMAKE_CURRENT_BINARY_DIR}/../build/tools/src/
		)

		if(NOT 32BLIT_TOOL)
			message(WARNING "32Blit tool not found. Looking for 32Blit.exe instead")
			find_program(32BLIT_TOOL 32Blit.exe PATHS
				${CMAKE_CURRENT_BINARY_DIR}/../build.mingw/tools/src/
			)
		endif()

		if(NOT 32BLIT_TOOL)
			message(WARNING "32Blit tool not found")
		endif()

		add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/32blit-stm32 32blit-stm32)
	else()
		add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/32blit-sdl 32blit-sdl)
	endif()
endif ()
