add_library(BlitHalSDL STATIC
	File.cpp
	Input.cpp
	JPEG.cpp
	Main.cpp
	Renderer.cpp
	Audio.cpp
	System.cpp
)

if(EMSCRIPTEN)
	target_compile_options(BlitHalSDL
		PRIVATE
			"-s;USE_SDL=2;-s ;USE_SDL_IMAGE=2"
	)

	set(SDL2_LIBRARIES "-s USE_SDL=2")
	set(SDL2_IMAGE_LIBRARY "-s USE_SDL_IMAGE=2")
else()
	# attempt to find the framework (find_package won't work as there's no config file)
	if(APPLE)
		find_library(SDL2_LIBRARIES NAMES SDL2)
		
		find_path(SDL2_INCLUDE_DIRS NAMES SDL.h
			PATHS ~/Library/Frameworks /Library/Frameworks
		)
	endif()

	if(NOT SDL2_LIBRARIES OR NOT SDL2_INCLUDE_DIRS)
		find_package(SDL2 REQUIRED)
	endif()

	# If SDL2 was built using CMake, the generated configuration files define SDL2::* targets instead of the SDL2_* variables
	if(TARGET SDL2::SDL2)
		set(SDL2_LIBRARIES SDL2::SDL2 SDL2::SDL2main)
	# handle SDL2 built with only a static library
	elseif(TARGET SDL2::SDL2-static)
		set(SDL2_LIBRARIES SDL2::SDL2-static SDL2::SDL2main)
	else()
		target_include_directories(BlitHalSDL
			PRIVATE	${SDL2_INCLUDE_DIRS}
		)
	endif()

	# find SDL2_image
	# TODO: may need to be more complicated
	find_path(SDL2_IMAGE_INCLUDE_DIR SDL_image.h
		HINTS ${SDL2_DIR} ${SDL2_DIR}../../../
		PATH_SUFFIXES SDL2 include/SDL2 include
	)
	target_include_directories(BlitHalSDL
		PRIVATE	${SDL2_IMAGE_INCLUDE_DIR}
	)

	# vs
	if(CMAKE_SIZEOF_VOID_P EQUAL 8)
		set(VC_LIB_PATH_SUFFIX lib/x64)
	else()
		set(VC_LIB_PATH_SUFFIX lib/x86)
	endif()

	find_library(SDL2_IMAGE_LIBRARY
		NAMES SDL2_image
		HINTS ${SDL2_DIR} ${SDL2_DIR}../../../
		PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX}
	)

	# dlls
	find_file(SDL2_IMAGE_DLL SDL2_image.dll
		HINTS ${SDL2_DIR} ${SDL2_DIR}../../../
		PATH_SUFFIXES bin ${VC_LIB_PATH_SUFFIX}
	)
endif()

target_link_libraries(BlitHalSDL PUBLIC BlitEngine ${SDL2_LIBRARIES} ${SDL2_IMAGE_LIBRARY})

# copy SDL2.dll to build/install dir for windows users
if(SDL2_DLL)
	configure_file(${SDL2_DLL} ${CMAKE_BINARY_DIR}/SDL2.dll COPYONLY)
	install(FILES ${SDL2_DLL} DESTINATION bin)
endif()

if(SDL2_IMAGE_DLL)
	configure_file(${SDL2_IMAGE_DLL} ${CMAKE_BINARY_DIR}/SDL2_image.dll COPYONLY)
	install(FILES ${SDL2_IMAGE_DLL} DESTINATION bin)
endif()

target_compile_definitions(BlitHalSDL
	PRIVATE
		-DWINDOW_TITLE=\"CMake!\"
)

if(DEFINED VIDEO_CAPTURE AND VIDEO_CAPTURE)
	find_path(AVCODEC_INCLUDE_DIR libavcodec/avcodec.h)
	find_library(AVCODEC_LIBRARY avcodec)

	find_path(AVFORMAT_INCLUDE_DIR libavformat/avformat.h)
	find_library(AVFORMAT_LIBRARY avformat)

	find_path(AVUTIL_INCLUDE_DIR libavutil/avutil.h)
	find_library(AVUTIL_LIBRARY avutil)

	find_path(AVDEVICE_INCLUDE_DIR libavdevice/avdevice.h)
	find_library(AVDEVICE_LIBRARY avdevice)

	find_library(SWRESAMPLE_LIBRARY swresample)

	find_library(SWSCALE_LIBRARY swscale)

	target_include_directories(BlitHalSDL PRIVATE ${AVCODEC_INCLUDE_DIR} ${AVFORMAT_INCLUDE_DIR} ${AVUTIL_INCLUDE_DIR} ${AVDEVICE_INCLUDE_DIR})
	target_link_libraries(BlitHalSDL PUBLIC ${AVCODEC_LIBRARY} ${AVFORMAT_LIBRARY} ${AVUTIL_LIBRARY} ${AVDEVICE_LIBRARY} ${SWRESAMPLE_LIBRARY} ${SWSCALE_LIBRARY})

	target_sources(BlitHalSDL PRIVATE VideoCapture.cpp VideoCaptureFfmpeg.cpp)

	target_compile_definitions(BlitHalSDL
		PRIVATE
			-DVIDEO_CAPTURE
			-D__STDC_CONSTANT_MACROS
	)
endif()

function(blit_executable NAME SOURCES)
	add_executable(${NAME} ${SOURCES} ${ARGN})

	install(TARGETS ${NAME}
		RUNTIME DESTINATION bin
	)

	if (${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC)
		target_link_libraries(${NAME} BlitHalSDL)
	elseif(${CMAKE_SYSTEM_NAME} STREQUAL Darwin)
  		target_link_libraries(${NAME} -Wl,-force_load BlitHalSDL)
	else()
  		target_link_libraries(${NAME} -Wl,--whole-archive BlitHalSDL -Wl,--no-whole-archive)
	endif()

	if(EMSCRIPTEN)
		set_target_properties(${NAME} PROPERTIES
			SUFFIX ".html"
			LINK_FLAGS "-s ENVIRONMENT=web -s SDL2_IMAGE_FORMATS=['jpg']"
		)
	endif()
endfunction()

function(blit_executable_int_flash NAME SOURCES)
	blit_executable(${NAME} ${SOURCES} ${ARGN})
endfunction()
