# Variable that you need to define to use this template
# USE_SFML, USE_RENDERER, USE_INPUT, USE_BULLET, USE_OPENGL, USE_QT5
#
# Container for list of file to be compiled :
# LIB_SRC_LIST, LIB_HEAD_LIST, EXEC_SRC_LIST, EXEC_HEAD_LIST
#
# If you want to specify a supplementary folder for include, use :
# EXTRA_INCLUDE_PATHS

cmake_minimum_required(VERSION 2.8)

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)

configure_file (
    "SparrowConfig.h.in"
    "${PROJECT_BINARY_DIR}/Config.h"
    )


#detect system and version
if(WIN32)
	set(LIB_DEBUG_FOLDER "libDebug/mingw32")
	set(LIB_RELEASE_FOLDER "libRelease/mingw32")
elseif(UNIX)
	if(${CMAKE_SYSTEM_VERSION} MATCHES "i686")
		set(LIB_DEBUG_FOLDER "libDebug/i686")
		set(LIB_RELEASE_FOLDER "libRelease/i686")
	elseif(${CMAKE_SYSTEM_VERSION} MATCHES "x86_64")
		set(LIB_DEBUG_FOLDER "libDebug/x86_64")
		set(LIB_RELEASE_FOLDER "libRelease/x86_64")
	endif()
endif()

#set dependencies paths
set(DEPENDENCIES_ROOT ${PROJECT_SOURCE_DIR}/../cpp_dependencies)
set(INCLUDE_ROOT ${DEPENDENCIES_ROOT}/include)

set(LIB_DEBUG_PATH ${DEPENDENCIES_ROOT}/${LIB_DEBUG_FOLDER})
set(LIB_RELEASE_PATH ${DEPENDENCIES_ROOT}/${LIB_RELEASE_FOLDER})

if(${CMAKE_BUILD_TYPE} MATCHES "Debug")
	set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LIB_DEBUG_PATH}) #for STATIC
	set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LIB_DEBUG_PATH}) #for SHARED
	
	list(APPEND LIB_PATHS ${LIB_DEBUG_PATH})
	list(APPEND LIB_PATHS "\n" ${LIB_RELEASE_PATH})
else()
	set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LIB_RELEASE_PATH}) #for STATIC
	set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LIB_RELEASE_PATH}) #for SHARED
	
	list(APPEND LIB_PATHS ${LIB_RELEASE_PATH})
endif()

#create library and executable
if(LIB_SRC_LIST)
	set(IS_LIBRARY True)
	set(LIBRARY_NAME ${PROJECT_NAME})
	add_library(${LIBRARY_NAME} STATIC ${LIB_SRC_LIST} ${RESOURCES_FILES})
	if(EXEC_SRC_LIST)
		set(EXECUTABLE_NAME "test${PROJECT_NAME}")
		add_executable(${EXECUTABLE_NAME} ${EXEC_SRC_LIST} ${RESOURCES_FILES})
	endif()
elseif(EXEC_SRC_LIST)
	set(EXECUTABLE_NAME "${PROJECT_NAME}")
	add_executable(${EXECUTABLE_NAME} ${EXEC_SRC_LIST} ${RESOURCES_FILES})
else()
	message(WARNING "NO SOURCE FILE PROVIDED")
endif()


add_definitions(-std=c++11)

#find libraries
set(LIB_DEPENDENCIES_LIST "")
set(INCLUDE_PATHS ${INCLUDE_ROOT})

# not used for now
# foreach(EXTENSION ${INCLUDE_PATHS_EXTENSION})
#     LIST(APPEND INCLUDE_PATHS ${INCLUDE_ROOT}${EXTENSION} " ")
# endforeach()

# TODO: Complete SFML
if(USE_SFML)
	find_library(SFML_LIBRARY_WINDOW
		NAMES
			sfml-window
		PATHS
			${LIB_PATHS}
	)
	
	find_library(SFML_LIBRARY_SYSTEM
		NAMES
			sfml-system
		PATHS
			${LIB_PATHS}
	)
	
	find_library(SFML_LIBRARY_AUDIO
		NAMES
			sfml-audio
		PATHS
			${LIB_PATHS}
	)
	
	find_library(SFML_LIBRARY_GRAPHICS
		NAMES
			sfml-graphics
		PATHS
			${LIB_PATHS}
	)
	
	set(USE_OPENGL True)
	
	add_definitions(-DSFML_STATIC)
	
	LIST(APPEND LIB_DEPENDENCIES_LIST ${SFML_LIBRARY_AUDIO} ${SFML_LIBRARY_GRAPHICS} ${SFML_LIBRARY_SYSTEM} ${SFML_LIBRARY_WINDOW})
	
	if(WIN32)
		LIST(APPEND LIB_DEPENDENCIES_LIST winmm gdi32 freetype jpeg openal32 flac vorbisenc vorbisfile vorbis ogg)
	elseif(UNIX)
		LIST(APPEND LIB_DEPENDENCIES_LIST freetype jpeg openal flac vorbisenc vorbisfile vorbis ogg)
	endif()
endif()

if(USE_RENDERER)
	find_library(SPARROW_RENDERER_LIBRARY
		NAMES
			SparrowRenderer
		PATHS
			${LIB_PATHS}
	)
	LIST(APPEND INCLUDE_PATHS "\n" ${PROJECT_SOURCE_DIR}/../sparrowrenderer/src)
	LIST(APPEND LIB_DEPENDENCIES_LIST ${SPARROW_RENDERER_LIBRARY})
endif()
	
if(USE_INPUT)
	find_library(SPARROW_INPUT_LIBRARY
		NAMES
			SparrowInput
		PATHS
			${LIB_PATHS}
	)
	LIST(APPEND INCLUDE_PATHS "\n" ${PROJECT_SOURCE_DIR}/../sparrowinput/src)
	LIST(APPEND LIB_DEPENDENCIES_LIST ${SPARROW_INPUT_LIBRARY})
endif()
	
if(USE_BULLET)
	find_library(BULLET_COLLISION_LIBRARY
		NAMES
			BulletCollision
		PATHS
			${LIB_PATHS}
	)

	find_library(BULLET_DYNAMICS_LIBRARY
		NAMES
			BulletDynamics
		PATHS
			${LIB_PATHS}
	)

	find_library(LINEAR_MATH_LIBRARY
		NAMES
			LinearMath
		PATHS
			${LIB_PATHS}
	)
	LIST(APPEND LIB_DEPENDENCIES_LIST ${BULLET_COLLISION_LIBRARY} ${BULLET_DYNAMICS_LIBRARY} ${LINEAR_MATH_LIBRARY})
	LIST(APPEND INCLUDE_PATHS "\n" ${INCLUDE_ROOT}/bullet)
endif()

if(USE_OPENGL)
	find_package(OpenGL REQUIRED)
	if(OPENGL_FOUND)
		LIST(APPEND LIB_DEPENDENCIES_LIST ${OPENGL_LIBRARIES})
	endif()
endif()

# TODO: Complete QT5
if(USE_QT5)
	if(${QT_MODULE} MATCHES "core")

	endif()
	if(${QT_MODULE} MATCHES "gui")

	endif()
	if(${QT_MODULE} MATCHES "opengl")
		find_package(Qt5OpenGL REQUIRED)
		if(QT5OPENGL_FOUND)
			LIST(APPEND LIB_DEPENDENCIES_LIST ${Qt5OpenGL_LIBRARIES})
			add_definitions(${Qt5OpenGL_DEFINITIONS})
			LIST(APPEND INCLUDE_PATHS "\n" ${Qt5OpenGL_INCLUDES})
		endif()
	endif()
	if(${QT_MODULE} MATCHES "widgets")
		find_package(Qt5Widgets REQUIRED)
		if(QT5WIDGETS_FOUND)
			LIST(APPEND LIB_DEPENDENCIES_LIST ${Qt5Widgets_LIBRARIES})
			add_definitions(${Qt5Widgets_DEFINITIONS})
			LIST(APPEND INCLUDE_PATHS "\n" ${Qt5Widgets_INCLUDES})
		endif()
	endif()
	if(${QT_MODULE} MATCHES "network")
	
	endif()
endif()

include_directories(
    ${INCLUDE_PATHS}
    ${EXTRA_INCLUDE}
)

if(LIB_SRC_LIST)
	target_link_libraries(
		${LIBRARY_NAME}
		${LIB_DEPENDENCIES_LIST}
        )
	if(EXEC_SRC_LIST)
		target_link_libraries(
			${EXECUTABLE_NAME}
			${LIBRARY_NAME}
		)
	endif()
elseif(EXEC_SRC_LIST)
	target_link_libraries(
		${EXECUTABLE_NAME}
		${LIB_DEPENDENCIES_LIST}
	)
endif()