# Solution configuration

cmake_minimum_required(VERSION 3.21)
project(projects VERSION 1.0.1 LANGUAGES CXX)

set(MOD_ARCHIVE_DIR "" CACHE PATH "Absolute path where to save the mod archive.")
set(MOD_ARCHIVE_FOLDER "" CACHE STRING "Folder name of the mod archive.")

option(ENABLE_MOD_ARCHIVE "Enable mod archive target." ON)

if (NOT IS_DIRECTORY ${CMAKE_INSTALL_PREFIX})
  message(FATAL_ERROR "CMAKE_INSTALL_PREFIX either does not exist or is not a directory.")
elseif(NOT IS_ABSOLUTE ${CMAKE_INSTALL_PREFIX})
  message(FATAL_ERROR "CMAKE_INSTALL_PREFIX is not an absolute path.")
else()
  # Get the mod folder.
  cmake_path(GET CMAKE_INSTALL_PREFIX FILENAME MOD_FOLDER)
  # Get the game directory.
  cmake_path(GET CMAKE_INSTALL_PREFIX PARENT_PATH GAME_DIR)
endif()

# Mod directory is the install directory.
set(MOD_DIR ${CMAKE_INSTALL_PREFIX})

if (ENABLE_MOD_ARCHIVE)
  if (NOT IS_DIRECTORY ${MOD_ARCHIVE_DIR})
    message(FATAL_ERROR "MOD_ARCHIVE_DIR either does not exist or is not a directory.")
  elseif(NOT IS_ABSOLUTE ${MOD_ARCHIVE_DIR})
    message(FATAL_ERROR "MOD_ARCHIVE_DIR is not an absolute path.")
  endif()

  if (MOD_ARCHIVE_FOLDER STREQUAL "")
    message(FATAL_ERROR "MOD_ARCHIVE_FOLDER has no value.")
  endif()
endif()

# SDK directories definitions
set(CL_DLL_DIR ${CMAKE_CURRENT_SOURCE_DIR}/cl_dll)
set(COMMON_DIR ${CMAKE_CURRENT_SOURCE_DIR}/common)
set(DLLS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/dlls)
set(ENGINE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/engine)
set(EXTERNAL_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external)
set(GAME_SHARED_DIR ${CMAKE_CURRENT_SOURCE_DIR}/game_shared)
set(LIB_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lib)
set(PM_SHARED_DIR ${CMAKE_CURRENT_SOURCE_DIR}/pm_shared)
set(PUBLIC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/public)
set(UTILS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/utils)
set(MOD_FILES_DIR ${CMAKE_CURRENT_SOURCE_DIR}/mod_files)

# Mod configuration file
set(MOD_CONFIG_FILE_PATH ${COMMON_DIR}/mod_config.h)
configure_file(
  ${CMAKE_CURRENT_SOURCE_DIR}/cmake/mod_config.h.in
  ${MOD_CONFIG_FILE_PATH}
  @ONLY
)

add_subdirectory(cl_dll)
add_subdirectory(dlls)

if (ENABLE_MOD_ARCHIVE)
  # Archive target definition
  set(MOD_ARCHIVE_TEMP_DIR ${MOD_ARCHIVE_DIR}/${MOD_ARCHIVE_FOLDER})
  set(MOD_ARCHIVE_MOD_DIR ${MOD_ARCHIVE_TEMP_DIR}/${MOD_FOLDER})
  set(MOD_ARCHIVE_COMPRESSED_FILE_NAME ${MOD_ARCHIVE_FOLDER}-${PROJECT_VERSION}.zip)
  set(MOD_ARCHIVE_COMPRESSED_FILE_PATH ${MOD_ARCHIVE_DIR}/${MOD_ARCHIVE_COMPRESSED_FILE_NAME})

  add_custom_target(mod_archive
    COMMAND ${CMAKE_COMMAND} -E echo Creating mod archive...
    # Copy Changelog.
    COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/CHANGELOG.md ${MOD_ARCHIVE_TEMP_DIR}/CHANGELOG.md
    # Copy License.
    COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.md ${MOD_ARCHIVE_TEMP_DIR}/LICENSE.md
    # Copy Installation instructions.
    COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/INSTALL.md ${MOD_ARCHIVE_TEMP_DIR}/INSTALL.md
    # Move mod files directory to a temporary archive folder.
    COMMAND ${CMAKE_COMMAND} -E copy_directory ${MOD_FILES_DIR} ${MOD_ARCHIVE_MOD_DIR}
    # Copy client.dll to temporary archive folder.
    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:hl_cdll> ${MOD_ARCHIVE_MOD_DIR}/cl_dlls/$<TARGET_FILE_NAME:hl_cdll>
    # Copy hl.dll to temporary archive folder.
    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:hldll> ${MOD_ARCHIVE_MOD_DIR}/dlls/$<TARGET_FILE_NAME:hldll>
    # Compress and create the archive.
    COMMAND ${CMAKE_COMMAND} -E chdir ${MOD_ARCHIVE_DIR} tar "cfv" ${MOD_ARCHIVE_COMPRESSED_FILE_NAME} --format=zip ${MOD_ARCHIVE_FOLDER}
    # Remove the temporary archive folder.
    COMMAND ${CMAKE_COMMAND} -E remove_directory ${MOD_ARCHIVE_TEMP_DIR}
    # Print compressed archive file location.
    COMMAND ${CMAKE_COMMAND} -E echo Mod archive saved to ${MOD_ARCHIVE_COMPRESSED_FILE_PATH}

    VERBATIM
    DEPENDS
      hl_cdll
      hldll
  )
endif()

# Installation
install(DIRECTORY mod_files/ DESTINATION .)
install(CODE "execute_process(COMMAND cmd /C \"echo Running mod setup...\")")
install(CODE "execute_process(COMMAND cmd /C \"call SETUP.bat\" WORKING_DIRECTORY \"${MOD_DIR}\")")