set(TARGET_BASE_NAME "DotaFactory")

set(TARGET_APP_NAME "${TARGET_BASE_NAME}")
set(TARGET_LIB_NAME "${TARGET_BASE_NAME}_lib")
set(TARGET_TEST_NAME "${TARGET_BASE_NAME}_test")

set(TARGET_LIB_HEADER_SEARCH_PATHS "${CMAKE_CURRENT_SOURCE_DIR}/lib" "${CMAKE_CURRENT_SOURCE_DIR}/external")
set(TARGET_TEST_HEADER_SEARCH_PATHS "${CMAKE_CURRENT_SOURCE_DIR}/test")

set(HEADER_SEARCH_PATHS ${TARGET_LIB_HEADER_SEARCH_PATHS} ${HEADER_SEARCH_PATHS})

set (SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}")


# Lib ------------------------------------------------------------

SET(HDRS)
SET(SRCS)
SET(LIB_INCLUDE_PATH)

add_subdirectory(external)
add_subdirectory(lib)

set_source_files_properties(${EXTERNAL_FILES} PROPERTIES COMPILE_FLAGS "-w")

# Find includes in corresponding build directories
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# Instruct CMake to run moc automatically when needed.
set(CMAKE_AUTOMOC ON)


SET(RELATIVE_HDRS)
foreach (_file ${HDRS})
	file (RELATIVE_PATH _relPath "${SRC_DIR}" "${_file}")
	list (APPEND RELATIVE_HDRS "${_relPath}")
endforeach()

SET(RELATIVE_SRCS)
foreach (_file ${SRCS})
	file (RELATIVE_PATH _relPath "${SRC_DIR}" "${_file}")
	list (APPEND RELATIVE_SRCS "${_relPath}")
endforeach()

add_files(
	LIB_FILES
	${RELATIVE_HDRS}
	${RELATIVE_SRCS}
)

set(HEADER_SEARCH_PATHS ${LIB_INCLUDE_PATH} ${HEADER_SEARCH_PATHS})

add_library(${TARGET_LIB_NAME} ${LIB_FILES} ${EXTERNAL_FILES})

create_source_groups(${LIB_FILES})
create_source_groups(${EXTERNAL_FILES})

UNSET(LIB_FILES)
UNSET(RELATIVE_HDRS)
UNSET(RELATIVE_SRCS)

set_property(TARGET ${TARGET_LIB_NAME} PROPERTY CXX_STANDARD 17)

set_property(
	TARGET ${TARGET_LIB_NAME}
	PROPERTY INCLUDE_DIRECTORIES "${HEADER_SEARCH_PATHS}"
)

# include external header without warnings
target_include_directories(${TARGET_LIB_NAME} SYSTEM
	PUBLIC "${SYSTEM_HEADER_SEARCH_PATHS}"
)

target_link_libraries(${TARGET_LIB_NAME} ${LINK_LIBRARIES})

set(CMAKE_AUTOMOC OFF)

set(LINK_LIBRARIES ${LINK_LIBRARIES} ${TARGET_LIB_NAME})


# App ------------------------------------------------------------

set(OUTPUT_ROOT_PATH "${CMAKE_BINARY_DIR}/${TARGET_BASE_NAME}")

if (WIN32)
	COPY_QT_BINARIES("${OUTPUT_ROOT_PATH}/Debug/app/" True)
	COPY_QT_BINARIES("${OUTPUT_ROOT_PATH}/Release/app/" False)
	
	string(REGEX REPLACE "/" "\\\\" BACKSLASHED_CMAKE_SOURCE_DIR ${CMAKE_SOURCE_DIR})
	string(REGEX REPLACE "/" "\\\\" BACKSLASHED_OUTPUT_ROOT_PATH ${OUTPUT_ROOT_PATH})
	execute_process(
		COMMAND "cmd.exe" "/k" "rmdir" "${BACKSLASHED_OUTPUT_ROOT_PATH}\\Debug\\app\\data" & "mklink" "/d" "/j" "${BACKSLASHED_OUTPUT_ROOT_PATH}\\Debug\\app\\data" "${BACKSLASHED_CMAKE_SOURCE_DIR}\\bin\\app\\data" & exit
		COMMAND "cmd.exe" "/k" "rmdir" "${BACKSLASHED_OUTPUT_ROOT_PATH}\\Release\\app\\data" & "mklink" "/d" "/j" "${BACKSLASHED_OUTPUT_ROOT_PATH}\\Release\\app\\data" "${BACKSLASHED_CMAKE_SOURCE_DIR}\\bin\\app\\data" & exit
	)
endif ()

foreach( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} )
	string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG )
	set( CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} "${OUTPUT_ROOT_PATH}/${OUTPUTCONFIG}/app/")
endforeach( OUTPUTCONFIG CMAKE_CONFIGURATION_TYPES )



add_subdirectory(app)

SET(RELATIVE_HDRS)
foreach (_file ${HDRS})
	file (RELATIVE_PATH _relPath "${SRC_DIR}" "${_file}")
	list (APPEND RELATIVE_HDRS "${_relPath}")
endforeach()

SET(RELATIVE_SRCS)
foreach (_file ${SRCS})
	file (RELATIVE_PATH _relPath "${SRC_DIR}" "${_file}")
	list (APPEND RELATIVE_SRCS "${_relPath}")
endforeach()

add_files(
	APP_FILES
	${RELATIVE_HDRS}
	${RELATIVE_SRCS}
)


add_executable(${TARGET_APP_NAME} ${APP_FILES})

set_target_properties(${TARGET_APP_NAME} PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY "${OUTPUT_ROOT_PATH}/$(Configuration)/app/")

create_source_groups(${APP_FILES})

set_property(TARGET ${TARGET_APP_NAME} PROPERTY CXX_STANDARD 17)

set_property(
	TARGET ${TARGET_APP_NAME} PROPERTY INCLUDE_DIRECTORIES 
	"${TARGET_APP_HEADER_SEARCH_PATHS}"
	"${HEADER_SEARCH_PATHS}" 
)

target_include_directories(${TARGET_APP_NAME} SYSTEM
	PUBLIC "${SYSTEM_HEADER_SEARCH_PATHS}"
)

target_link_libraries(${TARGET_APP_NAME} ${LINK_LIBRARIES})


# Test ------------------------------------------------------------

add_subdirectory(test)

# Find includes in corresponding build directories
set(CMAKE_INCLUDE_CURRENT_DIR ON)

add_executable(${TARGET_TEST_NAME} ${TEST_FILES})

create_source_groups(${TEST_FILES})

set_property(TARGET ${TARGET_TEST_NAME} PROPERTY CXX_STANDARD 17)

set_property(
	TARGET ${TARGET_TEST_NAME} PROPERTY INCLUDE_DIRECTORIES 
	"${TARGET_TEST_HEADER_SEARCH_PATHS}"
	"${HEADER_SEARCH_PATHS}" 
)

target_include_directories(${TARGET_TEST_NAME} SYSTEM
	PUBLIC "${SYSTEM_HEADER_SEARCH_PATHS}"
)

target_link_libraries(${TARGET_TEST_NAME} ${LINK_LIBRARIES})


# Export ------------------------------------------------------------

set(TARGET_LIB_NAME "${TARGET_LIB_NAME}" PARENT_SCOPE)
set(TARGET_APP_NAME "${TARGET_APP_NAME}" PARENT_SCOPE)
set(HEADER_SEARCH_PATHS ${HEADER_SEARCH_PATHS} PARENT_SCOPE)
set(LINK_LIBRARIES ${LINK_LIBRARIES} PARENT_SCOPE)
