cmake_minimum_required(VERSION 3.20)
project(CommonwealthOnlineHost)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)

find_package(Qt6 COMPONENTS Core Gui Widgets Network Concurrent REQUIRED)
find_program(DOTNET_EXECUTABLE dotnet REQUIRED)

set(PROJECT_SOURCES
    src/main.cpp
    src/MainWindow.h
    src/MainWindow.cpp
    src/ConfigDialog.h
    src/ConfigDialog.cpp
    src/ServerProcess.h
    src/ServerProcess.cpp
    src/resources/resources.qrc
)

add_executable(CommonwealthOnlineHost ${PROJECT_SOURCES})
target_link_libraries(CommonwealthOnlineHost Qt6::Core Qt6::Gui Qt6::Widgets Qt6::Network Qt6::Concurrent)

if(WIN32)
    set_target_properties(CommonwealthOnlineHost PROPERTIES WIN32_EXECUTABLE ON VS_DPI_AWARE "ON")
    set(CO_SERVER_RID "win-x64")
    set(CO_SERVER_EXECUTABLE_SUFFIX ".exe")
else()
    set(CO_SERVER_RID "linux-x64")
    set(CO_SERVER_EXECUTABLE_SUFFIX "")
endif()

set_target_properties(CommonwealthOnlineHost PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")

set(CO_SERVER_SOURCE_DIR "${CMAKE_SOURCE_DIR}/server")
set(CO_SERVER_PROJECT "${CO_SERVER_SOURCE_DIR}/CommonwealthOnline.Server.csproj")
set(CO_SERVER_PUBLISH_DIR "${CMAKE_BINARY_DIR}/server-publish/${CO_SERVER_RID}")
set(CO_SERVER_STAGE_DIR "$<TARGET_FILE_DIR:CommonwealthOnlineHost>/server")
set(CO_SERVER_STAGE_CONFIG "${CO_SERVER_STAGE_DIR}/commonwealth-server.json")

if(NOT EXISTS "${CO_SERVER_PROJECT}")
    message(FATAL_ERROR "Bundled C# server project not found at ${CO_SERVER_PROJECT}")
endif()

add_custom_command(TARGET CommonwealthOnlineHost POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E rm -rf "${CO_SERVER_PUBLISH_DIR}"
    COMMAND ${DOTNET_EXECUTABLE} publish "${CO_SERVER_PROJECT}"
        -c Release
        -r ${CO_SERVER_RID}
        --self-contained true
        -p:PublishSingleFile=true
        -p:DebugType=None
        -p:DebugSymbols=false
        -o "${CO_SERVER_PUBLISH_DIR}"
        --nologo
    COMMAND ${CMAKE_COMMAND}
        -DCO_SERVER_SOURCE_DIR=${CO_SERVER_SOURCE_DIR}
        -DCO_SERVER_PUBLISH_DIR=${CO_SERVER_PUBLISH_DIR}
        -DCO_SERVER_STAGE_DIR=${CO_SERVER_STAGE_DIR}
        -DCO_SERVER_STAGE_CONFIG=${CO_SERVER_STAGE_CONFIG}
        -DCO_SERVER_EXECUTABLE_SUFFIX=${CO_SERVER_EXECUTABLE_SUFFIX}
        -P "${CMAKE_SOURCE_DIR}/cmake/stage_server.cmake"
    COMMENT "Publishing and staging C# Commonwealth Online server"
    VERBATIM
)
