set(APP_NAME "Blobby Volley 2")
set(APP_AUTHOR "")

set(CMAKE_CXX_STANDARD 11)

if (MSVC)
	add_compile_options(/utf-8)
	# When building for MSVC with CMake,
	# the compiler warning flags (like /W3) are added by default.
else()
	add_compile_options(-Wall)
endif()

include_directories(.)

set(common_SRC
	base64.cpp base64.h
	BlobbyDebug.cpp BlobbyDebug.h
	Clock.cpp Clock.h
	DuelMatch.cpp DuelMatch.h
	FileRead.cpp FileRead.h
	FileSystem.cpp FileSystem.h
	FileWrite.cpp FileWrite.h
	File.cpp File.h
	GameLogic.cpp GameLogic.h
	GenericIO.cpp GenericIO.h
	Global.h
	Color.cpp Color.h
	NetworkMessage.cpp NetworkMessage.h
	PhysicWorld.cpp PhysicWorld.h
	SpeedController.cpp SpeedController.h
	UserConfig.cpp UserConfig.h
	PhysicState.cpp PhysicState.h
	DuelMatchState.cpp DuelMatchState.h
	GameLogicState.cpp GameLogicState.h
	InputSource.cpp InputSource.h
	PlayerInput.h PlayerInput.cpp
	IScriptableComponent.cpp IScriptableComponent.h
	PlayerIdentity.cpp PlayerIdentity.h
	server/DedicatedServer.cpp server/DedicatedServer.h
	server/NetworkPlayer.cpp server/NetworkPlayer.h
	server/NetworkGame.cpp server/NetworkGame.h
	server/MatchMaker.cpp server/MatchMaker.h
	replays/ReplayRecorder.cpp replays/ReplayRecorder.h
	replays/ReplaySavePoint.cpp replays/ReplaySavePoint.h
	)

set (blobby_SRC ${common_SRC} ${inputdevice_SRC}
	Blood.cpp Blood.h
	TextManager.cpp TextManager.h
	IMGUI.cpp IMGUI.h
	InputDevice.h
	InputManager.cpp InputManager.h
	LocalInputSource.cpp LocalInputSource.h
	RenderManager.cpp RenderManager.h
	RenderManagerGL2D.cpp RenderManagerGL2D.h
	RenderManagerSDL.cpp RenderManagerSDL.h
	RenderManagerNull.cpp RenderManagerNull.h
	ScriptedInputSource.cpp ScriptedInputSource.h
	SoundManager.cpp SoundManager.h
	Vector.h
	replays/ReplayPlayer.cpp replays/ReplayPlayer.h
	replays/ReplayLoader.cpp
	state/State.cpp state/State.h
	state/GameState.cpp state/GameState.h
	state/LocalGameState.cpp state/LocalGameState.h
	state/NetworkState.cpp state/NetworkState.h
	state/OptionsState.cpp state/OptionsState.h
	state/NetworkSearchState.cpp state/NetworkSearchState.h
	state/ReplayState.cpp state/ReplayState.h
	state/ReplaySelectionState.cpp state/ReplaySelectionState.h
	state/LobbyStates.cpp state/LobbyStates.h
	input_device/JoystickInput.cpp
	input_device/JoystickPool.cpp input_device/JoystickPool.h
	input_device/KeyboardInput.cpp
	input_device/MouseInput.cpp
	input_device/TouchInput.cpp
	BlobbyApp.h BlobbyApp.cpp
	)

set (blobby-server_SRC ${common_SRC}
	server/servermain.cpp
	)

find_package(Boost REQUIRED)
find_package(OpenGL)
add_subdirectory(raknet)
add_subdirectory(blobnet)

if (SWITCH)
	find_library(NX nx)
endif (SWITCH)

if (OPENGL_FOUND)
	include_directories(${OPENGL_INCLUDE_DIR})
	add_definitions(-DHAVE_LIBGL)
endif (OPENGL_FOUND)

if (UNIX AND (NOT ANDROID))
	add_definitions("-DBLOBBY_DATA_DIR=\"${CMAKE_INSTALL_PREFIX}/share/blobby\"")
endif()

set(BLOBBY_COMMON_LIBS lua::lua blobnet::blobnet tinyxml2::tinyxml2 PhysFS::PhysFS SDL2::SDL2main SDL2::SDL2 Boost::boost)

# other additional dependencies
if (NOT WIN32)
	find_package(Threads REQUIRED)
	set(BLOBBY_COMMON_LIBS ${BLOBBY_COMMON_LIBS} Threads::Threads)
endif ()

if (SWITCH)
	add_executable(blobby.elf main.cpp ${blobby_SRC})
	target_link_libraries(blobby.elf ${DEVKITPRO}/portlibs/switch/lib/libEGL.a ${DEVKITPRO}/portlibs/switch/lib/libdrm_nouveau.a ${DEVKITPRO}/portlibs/switch/lib/libglapi.a ${DEVKITPRO}/libnx/lib/libnx.a)
	add_custom_command(
		OUTPUT blobby.nro
		COMMAND ${DEVKITPRO}/tools/bin/elf2nro blobby.elf blobby.nro --icon=${CMAKE_SOURCE_DIR}/data/Icon.jpg --nacp=blobby.nacp
		DEPENDS blobby.elf blobby.nacp)
	add_custom_command(
		OUTPUT blobby.nacp
		COMMAND ${DEVKITPRO}/tools/bin/nacptool --create "${APP_NAME}" "${APP_AUTHOR}" "${PROJECT_VERSION}" VERBATIM blobby.nacp
	)
	add_custom_target(blobby ALL DEPENDS blobby.nro)
else ()
	if (ANDROID)
		add_library(blobby SHARED main.cpp ${blobby_SRC})
	elseif (WIN32)
	    add_executable(blobby WIN32 main.cpp ${blobby_SRC})
	else ()
		add_executable(blobby main.cpp ${blobby_SRC})
	endif ()
endif ()

target_link_libraries(blobby ${BLOBBY_COMMON_LIBS} ${OPENGL_LIBRARIES})


if (UNIX AND (NOT ANDROID) OR WIN32)
	add_executable(blobby-server ${blobby-server_SRC})
	target_link_libraries(blobby-server ${BLOBBY_COMMON_LIBS})
endif ()
if (UNIX AND (NOT ANDROID))
	add_executable(blobby-runtest EXCLUDE_FROM_ALL runtest.cpp ${blobby_SRC})
	target_link_libraries(blobby-runtest ${BLOBBY_COMMON_LIBS} ${OPENGL_LIBRARIES})

	add_executable(botbench EXCLUDE_FROM_ALL botbench.cpp ${blobby_SRC})
	target_link_libraries(botbench ${BLOBBY_COMMON_LIBS} ${OPENGL_LIBRARIES})
endif ()

if (MSYS)
	set_target_properties(blobby PROPERTIES LINK_FLAGS "-mwindows") # disable the console window
	set_target_properties(blobby-server PROPERTIES LINK_FLAGS "-mconsole") # enable the console window
endif()

if (WIN32)
	install(TARGETS blobby blobby-server DESTINATION .)
elseif (ANDROID)
	install(TARGETS blobby DESTINATION bin)
elseif (SWITCH)
	install(FILES ${CMAKE_CURRENT_BINARY_DIR}/blobby.nro DESTINATION .)
elseif (UNIX)
	install(TARGETS blobby blobby-server DESTINATION bin)
endif ()

if (MSVC)
	# set application icon
	target_sources(blobby PRIVATE ../win/res.rc)
	target_sources(blobby-server PRIVATE ../win/res.rc)
endif(MSVC)

# Header Checks
# Create a test target, consisting of one cpp file for each header, where the cpp file does nothing but
# include its header. If this compiles, then all our headers are self-contained.

# gather up the header files
file(GLOB_RECURSE HEADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.h)

# create a new target for this test. We use a static library (instead of an executable), because then
# we don't have to worry about things actually linking.
add_library(test-compile-headers STATIC EXCLUDE_FROM_ALL test_compile_main.cpp)

foreach(HEADER ${HEADERS})
	# construct a new file name based on the headers name
	string(MAKE_C_IDENTIFIER "${HEADER}" HEADER_TEST_FILE)
	set(TEST_COMPILE_FILE "${CMAKE_CURRENT_BINARY_DIR}/test_compile/${HEADER_TEST_FILE}.cpp")

	# create the test file and add to the target sources
	configure_file(test_compile.cpp.in ${TEST_COMPILE_FILE} @ONLY)
	target_sources(test-compile-headers PUBLIC ${TEST_COMPILE_FILE})
endforeach()

target_link_libraries(test-compile-headers PRIVATE ${BLOBBY_COMMON_LIBS})
