cmake_minimum_required(VERSION 3.6)
project(TeaSpeak-Server)

set(CMAKE_VERBOSE_MAKEFILE ON)
#--allow-multiple-definition
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpermissive -Wall -Wno-reorder -Wno-sign-compare -static-libgcc -static-libstdc++ -g -Wl,-no-whole-archive,--no-undefined -pthread ${MEMORY_DEBUG_FLAGS}")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -O3")

#NDEBUG
#set(CMAKE_CXX_FLAGS_RELWITHDEBINFO  "${CMAKE_CXX_FLAGS_RELEASE} -O2")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/environment/)

#disable for debug
#add_definitions(-DRELEASE_MODE)

include_directories(../music/include/)
include_directories(../shared/src)
include_directories(../license/src)
include_directories(../MusicBot/src)
include_directories(/usr/local/include/breakpad)
include_directories(${LIBRARY_PATH}/tomcrypt/src/headers)
include_directories(${LIBRARY_PATH}/spdlog/include)

add_definitions(-DLTM_DESC)
add_definitions(-DMUSIC_BOT)
add_definitions(-DUSE_BORINGSSL)

#0 = STABLE
#1 = BETA
#2 = ALPHA
#3 = PRIVATE
option(BUILD_TYPE "Sets the build type" OFF)
option(BUILD_TYPE_NAME "Sets the build type name" OFF)
option(COMPILE_WEB_CLIENT "Enable/Disable the web cleint future" OFF)
set(COMPILE_WEB_CLIENT "ON")

set(CMAKE_VERBOSE_MAKEFILE ON)
set(SERVER_SOURCE_FILES
		main.cpp
		src/client/ConnectedClient.cpp
		src/client/voice/PrecomputedPuzzles.cpp
		src/client/voice/VoiceClient.cpp
		src/client/voice/VoiceClientHandschake.cpp
		src/client/voice/VoiceClientCommandHandler.cpp
		src/client/voice/VoiceClientPacketHandler.cpp
		src/client/voice/VoiceClientView.cpp
		src/TS3ServerClientManager.cpp
		src/TSServer.cpp
		src/TS3ServerHeartbeat.cpp
		src/SignalHandler.cpp
		src/server/VoiceServer.cpp
		src/server/POWHandler.cpp
		src/client/voice/VoiceClientConnection.cpp
		src/client/ConnectedClientCommandHandler.cpp
		src/client/ConnectedClientNotifyHandler.cpp
		src/ServerManager.cpp
		src/server/file/FileServer.cpp
        src/channel/ServerChannel.cpp
        src/channel/ClientChannelView.cpp
		src/client/file/FileClient.cpp
		src/client/file/FileClientIO.cpp
		src/Group.cpp
		src/manager/BanManager.cpp
		src/client/InternalClient.cpp
		#src/weblist/WeblistClient.cpp
		#src/weblist/WebList.cpp

		src/client/DataClient.cpp
		src/server/QueryServer.cpp
		src/client/query/QueryClient.cpp
		src/client/query/QueryClientCommands.cpp
		src/client/query/QueryClientNotify.cpp


		src/manager/IpListManager.cpp

		src/ConnectionStatistics.cpp

		src/manager/TokeManager.cpp

		src/terminal/CommandHandler.cpp

		src/manager/ComplainManager.cpp
		src/DatabaseHelper.cpp

		src/manager/LetterManager.cpp
		src/manager/PermissionNameManager.cpp

		tomcryptTest.cpp

		src/pinteraction/ApplicationInteraction.cpp
		src/ServerManagerSnapshot.cpp
		src/ServerManagerSnapshotDeploy.cpp
		src/client/music/Song.cpp
		src/music/PlayablePlaylist.cpp
		src/InstanceHandler.cpp
		src/InstanceHandlerSetup.cpp

		src/Configuration.cpp

		src/build.cpp

		src/music/MusicPlaylist.cpp
		src/client/music/MusicClient.cpp
		src/client/music/MusicClientPlayer.cpp
		src/client/ConnectedClientTextCommandHandler.cpp
		src/music/MusicBotManager.cpp
		src/client/music/internal_provider/channel_replay/ChannelProvider.cpp

		src/geo/GeoLocation.cpp
		src/geo/IP2Location.cpp
		src/geo/VPNBlocker.cpp

		src/client/query/XMacroEventTypes.h

		src/server/VoiceIOManager.cpp
		src/server/WebIoManager.cpp
		src/client/SpeakingClient.cpp

		src/lincense/LicenseHelper.cpp
		../shared/src/ssl/SSLManager.cpp

		src/manager/SqlDataManager.cpp

		src/ShutdownHelper.cpp
		src/client/music/MusicQueue.cpp
		src/lincense/TeamSpeakLicense.cpp

		src/weblist/WebListManager.cpp
		src/weblist/TeamSpeakWebClient.cpp
)
if(COMPILE_WEB_CLIENT)
	add_definitions(-DCOMPILE_WEB_CLIENT)

	set(SERVER_SOURCE_FILES
		${SERVER_SOURCE_FILES}

		src/server/WebServer.cpp
		src/client/web/WebClient.cpp
#		src/server/web/WebRTCServer.cpp
		src/client/web/WSWebClient.cpp
		src/client/web/SampleHandler.cpp
		src/client/SpeakingClientHandshake.cpp
		src/client/web/VoiceBridge.cpp
	)
endif()

add_executable(PermHelper helpers/permgen.cpp)
target_link_libraries(PermHelper
		${LIBRARY_PATH_ED255}

		TeaSpeak            #Static
		TeaLicenseHelper    #Static
		TeaMusic            #Static
		${LIBRARY_PATH_THREAD_POOL}    #Static
		${LIBRARY_PATH_TERMINAL}   #Static
		${LIBRARY_PATH_VARIBALES}
		${LIBRARY_PATH_YAML}
		pthread
		stdc++fs
		${LIBEVENT_PATH}/libevent.a
		${LIBEVENT_PATH}/libevent_pthreads.a
		${LIBRARY_PATH_OPUS}
		${LIBRARY_PATH_JSON}
		${LIBRARY_PATH_PROTOBUF}

		#${LIBWEBRTC_LIBRARIES} #ATTENTIAN! WebRTC does not work with crypto! (Already contains a crypto version)
		${LIBRARY_TOM_CRYPT}
		${LIBRARY_TOM_MATH}

		#We're forsed to use boringssl caused by the fact that boringssl is already within webrtc!

		#Require a so
		sqlite3

		${LIBRARY_PATH_BREAKPAD}
		${LIBRARY_PATH_JDBC}
		${LIBRARY_PATH_PROTOBUF}

		${LIBRARY_PATH_DATA_PIPES}
		${LIBRARY_PATH_BORINGSSL_SSL}
		${LIBRARY_PATH_BORINGSSL_CRYPTO}
		dl
		jemalloc
)

add_executable(PermMapHelper helpers/PermMapGen.cpp)
target_link_libraries(PermMapHelper
		${LIBRARY_PATH_ED255}

		TeaSpeak            #Static
		TeaLicenseHelper    #Static
		TeaMusic            #Static
		${LIBRARY_PATH_THREAD_POOL}    #Static
		${LIBRARY_PATH_TERMINAL}   #Static
		${LIBRARY_PATH_VARIBALES}
		${LIBRARY_PATH_YAML}
		pthread
		stdc++fs
		${LIBEVENT_PATH}/libevent.a
		${LIBEVENT_PATH}/libevent_pthreads.a
		${LIBRARY_PATH_OPUS}
		${LIBRARY_PATH_JSON}
		${LIBRARY_PATH_PROTOBUF}

		#${LIBWEBRTC_LIBRARIES} #ATTENTIAN! WebRTC does not work with crypto! (Already contains a crypto version)
		${LIBRARY_TOM_CRYPT}
		${LIBRARY_TOM_MATH}

		#We're forsed to use boringssl caused by the fact that boringssl is already within webrtc!

		#Require a so
		sqlite3

		${LIBRARY_PATH_BREAKPAD}
		${LIBRARY_PATH_JDBC}
		${LIBRARY_PATH_PROTOBUF}

		${LIBRARY_PATH_DATA_PIPES}
		${LIBRARY_PATH_BORINGSSL_SSL}
		${LIBRARY_PATH_BORINGSSL_CRYPTO}
		dl
		jemalloc
		)


SET(CPACK_PACKAGE_VERSION_MAJOR "1")
SET(CPACK_PACKAGE_VERSION_MINOR "3")
SET(CPACK_PACKAGE_VERSION_PATCH "26")
if(BUILD_TYPE_NAME EQUAL OFF)
	SET(CPACK_PACKAGE_VERSION_DATA  "beta")
elseif(BUILD_TYPE_NAME STREQUAL "")
	SET(CPACK_PACKAGE_VERSION_DATA  "")
else()
	SET(CPACK_PACKAGE_VERSION_DATA  "-${BUILD_TYPE_NAME}")
endif()
if(BUILD_TYPE EQUAL OFF)
	SET(BUILD_TYPE "1")
endif()
set_source_files_properties(src/build.cpp PROPERTIES
		COMPILE_FLAGS "-DBUILD_MAJOR=${CPACK_PACKAGE_VERSION_MAJOR} -DBUILD_MINOR=${CPACK_PACKAGE_VERSION_MINOR} -DBUILD_PATCH=${CPACK_PACKAGE_VERSION_PATCH} -DBUILD_DATA=\"${CPACK_PACKAGE_VERSION_DATA}\" -DBUILD_TYPE=${BUILD_TYPE} -DBUILD_COUNT=0")
file(WRITE repro/env/buildVersion.txt "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}${CPACK_PACKAGE_VERSION_DATA}")

add_executable(TeaSpeakServer ${SERVER_SOURCE_FILES})
target_link_libraries(TeaSpeakServer
		${LIBRARY_PATH_THREAD_POOL}    #Static
		TeaSpeak            #Static
		TeaLicenseHelper    #Static
		TeaMusic            #Static
		${LIBRARY_PATH_TERMINAL}   #Static
		${LIBRARY_PATH_VARIBALES}
		${LIBRARY_PATH_YAML}
		pthread
		stdc++fs
		${LIBEVENT_PATH}/libevent.a
		${LIBEVENT_PATH}/libevent_pthreads.a
		${LIBRARY_PATH_OPUS}
		${LIBRARY_PATH_JSON}
		${LIBRARY_PATH_PROTOBUF}

		#We're forsed to use boringssl caused by the fact that boringssl is already within webrtc!

		#Require a so
		sqlite3

		${LIBRARY_PATH_BREAKPAD}
		${LIBRARY_PATH_PROTOBUF}

		#${LIBWEBRTC_LIBRARIES} #ATTENTIAN! WebRTC does not work with crypto! (Already contains a crypto version)
		${LIBRARY_TOM_CRYPT}
		${LIBRARY_TOM_MATH}

		mysqlclient.a
		z

		${LIBRARY_PATH_ED255}
)

if(${COMPILE_WEB_CLIENT})
	find_package(LibNice REQUIRED)
	find_package(UsrSCTP REQUIRED)
	target_link_libraries(TeaSpeakServer
		LibNice::LibNice
		${LIBRARY_PATH_DATA_PIPES}
	)
endif()
include_directories(${LIBRARY_PATH}/boringssl/include/)
target_link_libraries(TeaSpeakServer
        ${LIBRARY_PATH_BORINGSSL_SSL}
        ${LIBRARY_PATH_BORINGSSL_CRYPTO}
		dl
)

set(DISABLE_JEMALLOC ON)
if(NOT DISABLE_JEMALLOC)
	target_link_libraries(TeaSpeakServer
			jemalloc
	)
	add_definitions(-DHAVE_JEMALLOC)
endif()

#Fix RPATH
#patchelf --set-rpath ./libs/ TeaSpeakServer
#patchelf --remove-rpath TeaSpeakServer

#add_custom_command(
#        TARGET TeaSpeakServer
##       COMMAND bash -c "patchelf --set-rpath ./libs/ ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}TeaSpeakServer"
#        COMMAND bash -c "patchelf --remove-rpath ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}TeaSpeakServer"
#        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
#        COMMENT "Cleaning RPATH"
#)
