# MassBuilderSaveTool
# Copyright (C) 2021 Guillaume Jacquemin
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <https://www.gnu.org/licenses/>.

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

set(SAVETOOL_PROJECT_VERSION 1.2.0)

find_package(Corrade REQUIRED Main Containers Utility Interconnect)
find_package(Magnum REQUIRED GL Sdl2Application)
find_package(MagnumIntegration REQUIRED ImGui)

set_directory_properties(PROPERTIES CORRADE_USE_PEDANTIC_FLAGS ON)

corrade_add_resource(Assets assets.conf)

add_library(UESaveFile STATIC EXCLUDE_FROM_ALL
        UESaveFile/Serialisers/AbstractUnrealCollectionPropertySerialiser.h
        UESaveFile/Serialisers/AbstractUnrealPropertySerialiser.h
        UESaveFile/Serialisers/AbstractUnrealStructSerialiser.h
        UESaveFile/Serialisers/ArrayPropertySerialiser.h
        UESaveFile/Serialisers/ArrayPropertySerialiser.cpp
        UESaveFile/Serialisers/BoolPropertySerialiser.h
        UESaveFile/Serialisers/BoolPropertySerialiser.cpp
        UESaveFile/Serialisers/BytePropertySerialiser.h
        UESaveFile/Serialisers/BytePropertySerialiser.cpp
        UESaveFile/Serialisers/ColourPropertySerialiser.h
        UESaveFile/Serialisers/ColourPropertySerialiser.cpp
        UESaveFile/Serialisers/DateTimePropertySerialiser.h
        UESaveFile/Serialisers/DateTimePropertySerialiser.cpp
        UESaveFile/Serialisers/EnumPropertySerialiser.h
        UESaveFile/Serialisers/EnumPropertySerialiser.cpp
        UESaveFile/Serialisers/FloatPropertySerialiser.h
        UESaveFile/Serialisers/FloatPropertySerialiser.cpp
        UESaveFile/Serialisers/GuidPropertySerialiser.h
        UESaveFile/Serialisers/GuidPropertySerialiser.cpp
        UESaveFile/Serialisers/IntPropertySerialiser.h
        UESaveFile/Serialisers/IntPropertySerialiser.cpp
        UESaveFile/Serialisers/MapPropertySerialiser.h
        UESaveFile/Serialisers/MapPropertySerialiser.cpp
        UESaveFile/Serialisers/ResourcePropertySerialiser.h
        UESaveFile/Serialisers/ResourcePropertySerialiser.cpp
        UESaveFile/Serialisers/RotatorPropertySerialiser.h
        UESaveFile/Serialisers/RotatorPropertySerialiser.cpp
        UESaveFile/Serialisers/StringPropertySerialiser.h
        UESaveFile/Serialisers/StringPropertySerialiser.cpp
        UESaveFile/Serialisers/SetPropertySerialiser.h
        UESaveFile/Serialisers/SetPropertySerialiser.cpp
        UESaveFile/Serialisers/StructSerialiser.h
        UESaveFile/Serialisers/StructSerialiser.cpp
        UESaveFile/Serialisers/TextPropertySerialiser.h
        UESaveFile/Serialisers/TextPropertySerialiser.cpp
        UESaveFile/Serialisers/UnrealPropertySerialiser.h
        UESaveFile/Serialisers/VectorPropertySerialiser.h
        UESaveFile/Serialisers/VectorPropertySerialiser.cpp
        UESaveFile/Serialisers/Vector2DPropertySerialiser.h
        UESaveFile/Serialisers/Vector2DPropertySerialiser.cpp

        UESaveFile/Types/ArrayProperty.h
        UESaveFile/Types/BoolProperty.h
        UESaveFile/Types/ByteProperty.h
        UESaveFile/Types/ColourStructProperty.h
        UESaveFile/Types/DateTimeStructProperty.h
        UESaveFile/Types/EnumProperty.h
        UESaveFile/Types/FloatProperty.h
        UESaveFile/Types/GenericStructProperty.h
        UESaveFile/Types/GuidStructProperty.h
        UESaveFile/Types/IntProperty.h
        UESaveFile/Types/MapProperty.h
        UESaveFile/Types/NoneProperty.h
        UESaveFile/Types/RotatorStructProperty.h
        UESaveFile/Types/SetProperty.h
        UESaveFile/Types/StringProperty.h
        UESaveFile/Types/StructProperty.h
        UESaveFile/Types/ResourceItemValue.h
        UESaveFile/Types/TextProperty.h
        UESaveFile/Types/UnrealProperty.h
        UESaveFile/Types/UnrealPropertyBase.h
        UESaveFile/Types/VectorStructProperty.h

        UESaveFile/Debug.h
        UESaveFile/Debug.cpp
        UESaveFile/UESaveFile.h
        UESaveFile/UESaveFile.cpp
        UESaveFile/BinaryReader.h
        UESaveFile/BinaryReader.cpp
        UESaveFile/BinaryWriter.h
        UESaveFile/BinaryWriter.cpp
        UESaveFile/PropertySerialiser.h
        UESaveFile/PropertySerialiser.cpp)

target_link_libraries(UESaveFile PRIVATE
        Corrade::Containers
        Corrade::Utility
        Magnum::Magnum)

add_executable(MassBuilderSaveTool WIN32
    main.cpp
    SaveTool/SaveTool.h
    SaveTool/SaveTool.cpp
    SaveTool/SaveTool_drawAbout.cpp
    SaveTool/SaveTool_drawMainMenu.cpp
    SaveTool/SaveTool_MainManager.cpp
    SaveTool/SaveTool_MassViewer.cpp
    SaveTool/SaveTool_ProfileManager.cpp
    ProfileManager/ProfileManager.h
    ProfileManager/ProfileManager.cpp
    Profile/Profile.h
    Profile/Profile.cpp
    Profile/ResourceIDs.h
    MassManager/MassManager.h
    MassManager/MassManager.cpp
    Mass/Mass.h
    Mass/Mass.cpp
    Maps/LastMissionId.h
    Maps/StoryProgress.h
    Maps/StyleNames.h
    ToastQueue/ToastQueue.h
    ToastQueue/ToastQueue.cpp
    FontAwesome/IconsFontAwesome5.h
    FontAwesome/IconsFontAwesome5Brands.h
    resource.rc
    ${Assets})

if(CMAKE_BUILD_TYPE STREQUAL Debug)
    add_compile_definitions(SAVETOOL_DEBUG_BUILD)
endif()
add_compile_definitions(SAVETOOL_VERSION="${SAVETOOL_PROJECT_VERSION}"
                        SAVETOOL_CODENAME="Cute Quindolia"
                        SUPPORTED_GAME_VERSION="0.7.6")

if(CMAKE_BUILD_TYPE STREQUAL Release)
    set_target_properties(MassBuilderSaveTool PROPERTIES OUTPUT_NAME MassBuilderSaveTool-${SAVETOOL_PROJECT_VERSION})
endif()

target_link_options(MassBuilderSaveTool PRIVATE -static -static-libgcc -static-libstdc++)

target_link_libraries(MassBuilderSaveTool PRIVATE
    Corrade::Containers
    Corrade::Utility
    Corrade::Interconnect
    Corrade::Main
    Magnum::Magnum
    Magnum::GL
    Magnum::Sdl2Application
    MagnumIntegration::ImGui
    UESaveFile
    efsw
    zip
    cpr::cpr
    nlohmann_json::nlohmann_json
    imm32
    wtsapi32)