project(MultiMC_logic)

include (UnitTest)

set(CORE_SOURCES
	# LOGIC - Base classes and infrastructure
	BaseInstaller.h
	BaseInstaller.cpp
	BaseVersionList.h
	BaseVersionList.cpp
	InstanceCreationTask.h
	InstanceCreationTask.cpp
	InstanceCopyTask.h
	InstanceCopyTask.cpp
	InstanceImportTask.h
	InstanceImportTask.cpp
	InstanceList.h
	InstanceList.cpp
	LoggedProcess.h
	LoggedProcess.cpp
	MessageLevel.cpp
	MessageLevel.h
	BaseInstanceProvider.h
	FolderInstanceProvider.h
	FolderInstanceProvider.cpp
	BaseVersion.h
	BaseInstance.h
	BaseInstance.cpp
	NullInstance.h
	MMCZip.h
	MMCZip.cpp
	MMCStrings.h
	MMCStrings.cpp

	# Use tracking separate from memory management
	Usable.h

	# Prefix tree where node names are strings between separators
	SeparatorPrefixTree.h

	# WARNING: globals live here
	Env.h
	Env.cpp

	# JSON parsing helpers
	Json.h
	Json.cpp

	FileSystem.h
	FileSystem.cpp

	Exception.h

	# RW lock protected map
	RWStorage.h

	# A variable that has an implicit default value and keeps track of changes
	DefaultVariable.h

	# a smart pointer wrapper intended for safer use with Qt signal/slot mechanisms
	QObjectPtr.h

	# Compression support
	GZip.h
	GZip.cpp

	# Command line parameter parsing
	Commandline.h
	Commandline.cpp

	# Version number string support
	Version.h
	Version.cpp

	# A Recursive file system watcher
	RecursiveFileSystemWatcher.h
	RecursiveFileSystemWatcher.cpp
)

add_unit_test(FileSystem
	SOURCES FileSystem_test.cpp
	LIBS MultiMC_logic
	DATA testdata
	)

add_unit_test(GZip
	SOURCES GZip_test.cpp
	LIBS MultiMC_logic
	)

set(PATHMATCHER_SOURCES
	# Path matchers
	pathmatcher/FSTreeMatcher.h
	pathmatcher/IPathMatcher.h
	pathmatcher/MultiMatcher.h
	pathmatcher/RegexpMatcher.h
)

set(NET_SOURCES
	# network stuffs
	net/ByteArraySink.h
	net/ChecksumValidator.h
	net/Download.cpp
	net/Download.h
	net/FileSink.cpp
	net/FileSink.h
	net/HttpMetaCache.cpp
	net/HttpMetaCache.h
	net/MetaCacheSink.cpp
	net/MetaCacheSink.h
	net/NetAction.h
	net/NetJob.cpp
	net/NetJob.h
	net/PasteUpload.cpp
	net/PasteUpload.h
	net/Sink.h
	net/URLConstants.cpp
	net/URLConstants.h
	net/Validator.h
)

# Game launch logic
set(LAUNCH_SOURCES
	launch/steps/PostLaunchCommand.cpp
	launch/steps/PostLaunchCommand.h
	launch/steps/PreLaunchCommand.cpp
	launch/steps/PreLaunchCommand.h
	launch/steps/TextPrint.cpp
	launch/steps/TextPrint.h
	launch/steps/Update.cpp
	launch/steps/Update.h
	launch/LaunchStep.cpp
	launch/LaunchStep.h
	launch/LaunchTask.cpp
	launch/LaunchTask.h
	launch/LogModel.cpp
	launch/LogModel.h
)

# Old update system
set(UPDATE_SOURCES
	updater/GoUpdate.h
	updater/GoUpdate.cpp
	updater/UpdateChecker.h
	updater/UpdateChecker.cpp
	updater/DownloadTask.h
	updater/DownloadTask.cpp
)

add_unit_test(UpdateChecker
	SOURCES updater/UpdateChecker_test.cpp
	LIBS MultiMC_logic
	DATA updater/testdata
	)

add_unit_test(DownloadTask
	SOURCES updater/DownloadTask_test.cpp
	LIBS MultiMC_logic
	DATA updater/testdata
	)

# Rarely used notifications
set(NOTIFICATIONS_SOURCES
	# Notifications - short warning messages
	notifications/NotificationChecker.h
	notifications/NotificationChecker.cpp
)

# Backend for the news bar... there's usually no news.
set(NEWS_SOURCES
	# News System
	news/NewsChecker.h
	news/NewsChecker.cpp
	news/NewsEntry.h
	news/NewsEntry.cpp
)

# Icon interface
set(ICONS_SOURCES
	# News System
	icons/IIconList.h
	icons/IIconList.cpp
)

# Minecraft services status checker
set(STATUS_SOURCES
	# Status system
	status/StatusChecker.h
	status/StatusChecker.cpp
)

# Support for Minecraft instances and launch
set(MINECRAFT_SOURCES
	# Minecraft support
	minecraft/auth/AuthSession.h
	minecraft/auth/AuthSession.cpp
	minecraft/auth/MojangAccountList.h
	minecraft/auth/MojangAccountList.cpp
	minecraft/auth/MojangAccount.h
	minecraft/auth/MojangAccount.cpp
	minecraft/auth/YggdrasilTask.h
	minecraft/auth/YggdrasilTask.cpp
	minecraft/auth/flows/AuthenticateTask.h
	minecraft/auth/flows/AuthenticateTask.cpp
	minecraft/auth/flows/RefreshTask.cpp
	minecraft/auth/flows/RefreshTask.cpp
	minecraft/auth/flows/ValidateTask.h
	minecraft/auth/flows/ValidateTask.cpp
	minecraft/onesix/OneSixUpdate.h
	minecraft/onesix/OneSixUpdate.cpp
	minecraft/onesix/OneSixInstance.h
	minecraft/onesix/OneSixInstance.cpp
	minecraft/onesix/OneSixProfileStrategy.cpp
	minecraft/onesix/OneSixProfileStrategy.h
	minecraft/onesix/OneSixVersionFormat.cpp
	minecraft/onesix/OneSixVersionFormat.h
	minecraft/onesix/update/AssetUpdateTask.h
	minecraft/onesix/update/AssetUpdateTask.cpp
	minecraft/onesix/update/FMLLibrariesTask.cpp
	minecraft/onesix/update/FMLLibrariesTask.h
	minecraft/onesix/update/FoldersTask.cpp
	minecraft/onesix/update/FoldersTask.h
	minecraft/onesix/update/LibrariesTask.cpp
	minecraft/onesix/update/LibrariesTask.h
	minecraft/launch/ClaimAccount.cpp
	minecraft/launch/ClaimAccount.h
	minecraft/launch/CreateServerResourcePacksFolder.cpp
	minecraft/launch/CreateServerResourcePacksFolder.h
	minecraft/launch/ModMinecraftJar.cpp
	minecraft/launch/ModMinecraftJar.h
	minecraft/launch/DirectJavaLaunch.cpp
	minecraft/launch/DirectJavaLaunch.h
	minecraft/launch/ExtractNatives.cpp
	minecraft/launch/ExtractNatives.h
	minecraft/launch/LauncherPartLaunch.cpp
	minecraft/launch/LauncherPartLaunch.h
	minecraft/launch/PrintInstanceInfo.cpp
	minecraft/launch/PrintInstanceInfo.h
	minecraft/legacy/LegacyModList.h
	minecraft/legacy/LegacyModList.cpp
	minecraft/legacy/LegacyUpdate.h
	minecraft/legacy/LegacyUpdate.cpp
	minecraft/legacy/LegacyInstance.h
	minecraft/legacy/LegacyInstance.cpp
	minecraft/legacy/LwjglVersionList.h
	minecraft/legacy/LwjglVersionList.cpp
	minecraft/GradleSpecifier.h
	minecraft/MinecraftProfile.cpp
	minecraft/MinecraftProfile.h
	minecraft/MojangVersionFormat.cpp
	minecraft/MojangVersionFormat.h
	minecraft/JarMod.h
	minecraft/MinecraftInstance.cpp
	minecraft/MinecraftInstance.h
	minecraft/MinecraftVersion.cpp
	minecraft/MinecraftVersion.h
	minecraft/MinecraftVersionList.cpp
	minecraft/MinecraftVersionList.h
	minecraft/Rule.cpp
	minecraft/Rule.h
	minecraft/OpSys.cpp
	minecraft/OpSys.h
	minecraft/ParseUtils.cpp
	minecraft/ParseUtils.h
	minecraft/ProfileUtils.cpp
	minecraft/ProfileUtils.h
	minecraft/ProfileStrategy.h
	minecraft/Library.cpp
	minecraft/Library.h
	minecraft/MojangDownloadInfo.h
	minecraft/VersionBuildError.h
	minecraft/VersionFile.cpp
	minecraft/VersionFile.h
	minecraft/ProfilePatch.h
	minecraft/VersionFilterData.h
	minecraft/VersionFilterData.cpp
	minecraft/Mod.h
	minecraft/Mod.cpp
	minecraft/ModList.h
	minecraft/ModList.cpp
	minecraft/World.h
	minecraft/World.cpp
	minecraft/WorldList.h
	minecraft/WorldList.cpp

	# FTB
	minecraft/ftb/OneSixFTBInstance.h
	minecraft/ftb/OneSixFTBInstance.cpp
	minecraft/ftb/LegacyFTBInstance.h
	minecraft/ftb/LegacyFTBInstance.cpp
	minecraft/ftb/FTBProfileStrategy.h
	minecraft/ftb/FTBProfileStrategy.cpp
	minecraft/ftb/FTBInstanceProvider.cpp
	minecraft/ftb/FTBInstanceProvider.h
	minecraft/ftb/FTBPlugin.h
	minecraft/ftb/FTBPlugin.cpp

	# Assets
	minecraft/AssetsUtils.h
	minecraft/AssetsUtils.cpp

	# Forge and all things forge related
	minecraft/forge/ForgeVersion.h
	minecraft/forge/ForgeVersion.cpp
	minecraft/forge/ForgeVersionList.h
	minecraft/forge/ForgeVersionList.cpp
	minecraft/forge/ForgeXzDownload.h
	minecraft/forge/ForgeXzDownload.cpp
	minecraft/forge/LegacyForge.h
	minecraft/forge/LegacyForge.cpp
	minecraft/forge/ForgeInstaller.h
	minecraft/forge/ForgeInstaller.cpp

	# Liteloader and related things
	minecraft/liteloader/LiteLoaderInstaller.h
	minecraft/liteloader/LiteLoaderInstaller.cpp
	minecraft/liteloader/LiteLoaderVersionList.h
	minecraft/liteloader/LiteLoaderVersionList.cpp
	minecraft/SkinUpload.cpp
	minecraft/SkinUpload.h
	)

add_unit_test(GradleSpecifier
	SOURCES minecraft/GradleSpecifier_test.cpp
	LIBS MultiMC_logic
	)

add_unit_test(MojangVersionFormat
	SOURCES minecraft/MojangVersionFormat_test.cpp
	LIBS MultiMC_logic
	DATA minecraft/testdata
	)

add_unit_test(Library
	SOURCES minecraft/Library_test.cpp
	LIBS MultiMC_logic
	)

# FIXME: shares data with FileSystem test
add_unit_test(ModList
	SOURCES minecraft/ModList_test.cpp
	DATA testdata
	LIBS MultiMC_logic
	)

add_unit_test(ParseUtils
	SOURCES minecraft/ParseUtils_test.cpp
	LIBS MultiMC_logic
	)

# the screenshots feature
set(SCREENSHOTS_SOURCES
	screenshots/Screenshot.h
	screenshots/ImgurUpload.h
	screenshots/ImgurUpload.cpp
	screenshots/ImgurAlbumCreation.h
	screenshots/ImgurAlbumCreation.cpp
)

set(TASKS_SOURCES
	# Tasks
	tasks/Task.h
	tasks/Task.cpp
	tasks/ThreadTask.h
	tasks/ThreadTask.cpp
	tasks/SequentialTask.h
	tasks/SequentialTask.cpp
)

set(SETTINGS_SOURCES
	# Settings
	settings/INIFile.cpp
	settings/INIFile.h
	settings/INISettingsObject.cpp
	settings/INISettingsObject.h
	settings/OverrideSetting.cpp
	settings/OverrideSetting.h
	settings/PassthroughSetting.cpp
	settings/PassthroughSetting.h
	settings/Setting.cpp
	settings/Setting.h
	settings/SettingsObject.cpp
	settings/SettingsObject.h
)

add_unit_test(INIFile
	SOURCES settings/INIFile_test.cpp
	LIBS MultiMC_logic
	)

set(JAVA_SOURCES
	# Java related code
	java/launch/CheckJava.cpp
	java/launch/CheckJava.h
	java/JavaChecker.h
	java/JavaChecker.cpp
	java/JavaCheckerJob.h
	java/JavaCheckerJob.cpp
	java/JavaInstall.h
	java/JavaInstall.cpp
	java/JavaInstallList.h
	java/JavaInstallList.cpp
	java/JavaUtils.h
	java/JavaUtils.cpp
	java/JavaVersion.h
	java/JavaVersion.cpp
)

add_unit_test(JavaVersion
	SOURCES java/JavaVersion_test.cpp
	LIBS MultiMC_logic
	)

set(TRANSLATIONS_SOURCES
	# Translations
	trans/TranslationDownloader.h
	trans/TranslationDownloader.cpp
)

set(TOOLS_SOURCES
	# Tools
	tools/BaseExternalTool.cpp
	tools/BaseExternalTool.h
	tools/BaseProfiler.cpp
	tools/BaseProfiler.h
	tools/JProfiler.cpp
	tools/JProfiler.h
	tools/JVisualVM.cpp
	tools/JVisualVM.h
	tools/MCEditTool.cpp
	tools/MCEditTool.h
)

set(WONKO_SOURCES
	# Wonko
	wonko/tasks/BaseWonkoEntityRemoteLoadTask.cpp
	wonko/tasks/BaseWonkoEntityRemoteLoadTask.h
	wonko/tasks/BaseWonkoEntityLocalLoadTask.cpp
	wonko/tasks/BaseWonkoEntityLocalLoadTask.h
	wonko/format/WonkoFormatV1.cpp
	wonko/format/WonkoFormatV1.h
	wonko/format/WonkoFormat.cpp
	wonko/format/WonkoFormat.h
	wonko/BaseWonkoEntity.cpp
	wonko/BaseWonkoEntity.h
	wonko/WonkoVersionList.cpp
	wonko/WonkoVersionList.h
	wonko/WonkoVersion.cpp
	wonko/WonkoVersion.h
	wonko/WonkoIndex.cpp
	wonko/WonkoIndex.h
	wonko/WonkoUtil.cpp
	wonko/WonkoUtil.h
	wonko/WonkoReference.cpp
	wonko/WonkoReference.h
)

add_unit_test(WonkoIndex
	SOURCES wonko/WonkoIndex_test.cpp
	LIBS MultiMC_logic
	)

################################ COMPILE ################################

# we need zlib
find_package(ZLIB REQUIRED)

set(LOGIC_SOURCES
	${CORE_SOURCES}
	${PATHMATCHER_SOURCES}
	${NET_SOURCES}
	${LAUNCH_SOURCES}
	${UPDATE_SOURCES}
	${NOTIFICATIONS_SOURCES}
	${NEWS_SOURCES}
	${STATUS_SOURCES}
	${MINECRAFT_SOURCES}
	${SCREENSHOTS_SOURCES}
	${TASKS_SOURCES}
	${SETTINGS_SOURCES}
	${JAVA_SOURCES}
	${TRANSLATIONS_SOURCES}
	${TOOLS_SOURCES}
	${WONKO_SOURCES}
	${ICONS_SOURCES}
)

add_library(MultiMC_logic SHARED ${LOGIC_SOURCES})
set_target_properties(MultiMC_logic PROPERTIES CXX_VISIBILITY_PRESET hidden VISIBILITY_INLINES_HIDDEN 1)

generate_export_header(MultiMC_logic)

# Link
target_link_libraries(MultiMC_logic xz-embedded unpack200 ${QUAZIP_LIBRARIES} nbt++ ${ZLIB_LIBRARIES})
qt5_use_modules(MultiMC_logic Core Xml Network Concurrent)
add_dependencies(MultiMC_logic QuaZIP)

# Mark and export headers
target_include_directories(MultiMC_logic PUBLIC "${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}" PRIVATE "${ZLIB_INCLUDE_DIRS}")