if(NOT DEFINED GLDOZE_REPO_ROOT)
  get_filename_component(GLDOZE_REPO_ROOT "${CMAKE_CURRENT_LIST_DIR}/../.." ABSOLUTE)
endif()

set(TECHLOBBY_APP_SOURCES
  ${CMAKE_CURRENT_LIST_DIR}/src/techlobby_app.cpp
  ${CMAKE_CURRENT_LIST_DIR}/src/techlobby_windows_paths.cpp
)

add_library(techlobby_app_support STATIC ${TECHLOBBY_APP_SOURCES})
target_link_libraries(techlobby_app_support
  PUBLIC
    gldoze_engine
)
target_include_directories(techlobby_app_support
  PUBLIC
    ${CMAKE_CURRENT_LIST_DIR}/src
)

function(techlobby_apply_size_flags target_name)
  if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
    target_compile_options(${target_name} PRIVATE
      -ffunction-sections
      -fdata-sections
    )
    target_link_options(${target_name} PRIVATE
      -Wl,--as-needed
      -Wl,--gc-sections
    )
  endif()
endfunction()

function(techlobby_strip_release_binary target_name)
  if(CMAKE_STRIP AND CMAKE_BUILD_TYPE MATCHES "^(Release|MinSizeRel)$")
    add_custom_command(TARGET ${target_name} POST_BUILD
      COMMAND "${CMAKE_STRIP}" --strip-unneeded "$<TARGET_FILE:${target_name}>"
      COMMENT "Stripping ${target_name}"
      VERBATIM
    )
  endif()
endfunction()

add_executable(TechLobbyWin
  ${CMAKE_CURRENT_LIST_DIR}/src/main_techlobby_windows.cpp
  ${CMAKE_CURRENT_LIST_DIR}/src/app_factory.cpp
)
target_link_libraries(TechLobbyWin PRIVATE techlobby_app_support)
target_compile_definitions(TechLobbyWin PRIVATE TECHLOBBY_FORCE_WINDOWS_RULES=1)
set_target_properties(TechLobbyWin PROPERTIES
  RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}"
)

if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
  techlobby_apply_size_flags(TechLobbyWin)
endif()
techlobby_strip_release_binary(TechLobbyWin)

if(WIN32)
  set_target_properties(TechLobbyWin PROPERTIES WIN32_EXECUTABLE TRUE)
endif()

if(UNIX AND NOT APPLE)
  add_executable(TechLobbyLinux
    ${CMAKE_CURRENT_LIST_DIR}/src/main_techlobby_linux.cpp
    ${CMAKE_CURRENT_LIST_DIR}/src/app_factory.cpp
  )
  target_link_libraries(TechLobbyLinux PRIVATE techlobby_app_support)
  target_compile_definitions(TechLobbyLinux PRIVATE TECHLOBBY_FORCE_WINDOWS_RULES=0)
  set_target_properties(TechLobbyLinux PROPERTIES
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}"
  )
  techlobby_apply_size_flags(TechLobbyLinux)
  techlobby_strip_release_binary(TechLobbyLinux)

  if(GLDOZE_MINIMAL_TECHLOBBY)
    add_executable(TechLobbyLinuxStatic
      ${CMAKE_CURRENT_LIST_DIR}/src/main_techlobby_linux.cpp
      ${CMAKE_CURRENT_LIST_DIR}/src/app_factory.cpp
    )
    target_link_libraries(TechLobbyLinuxStatic PRIVATE techlobby_app_support)
    target_compile_definitions(TechLobbyLinuxStatic PRIVATE TECHLOBBY_FORCE_WINDOWS_RULES=0)
    set_target_properties(TechLobbyLinuxStatic PROPERTIES
      RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}"
    )
    techlobby_apply_size_flags(TechLobbyLinuxStatic)
    if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
      target_link_options(TechLobbyLinuxStatic PRIVATE
        -static-libstdc++
        -static-libgcc
      )
    endif()
    techlobby_strip_release_binary(TechLobbyLinuxStatic)
  else()
    add_custom_target(TechLobbyLinuxStatic
      COMMAND ${CMAKE_COMMAND} -E rm -f "${CMAKE_BINARY_DIR}/TechLobbyLinuxStatic"
      COMMAND ${CMAKE_COMMAND} -E echo "TechLobbyLinuxStatic requires GLDOZE_MINIMAL_TECHLOBBY=ON. Use: cmake --build --preset techlobby-linux-static"
      COMMAND ${CMAKE_COMMAND} -E false
      COMMENT "TechLobbyLinuxStatic is disabled in non-minimal builds"
      VERBATIM
    )
  endif()
endif()

if(WIN32)
  if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.21)
    if(GLDOZE_MINIMAL_TECHLOBBY)
      install(TARGETS TechLobbyWin
        RUNTIME DESTINATION .
        COMPONENT TechLobbyRuntime
      )
    else()
      install(TARGETS TechLobbyWin
        RUNTIME_DEPENDENCY_SET techlobby_runtime_deps
        RUNTIME DESTINATION .
        COMPONENT TechLobbyRuntime
      )
      install(RUNTIME_DEPENDENCY_SET techlobby_runtime_deps
        PRE_EXCLUDE_REGEXES
          "api-ms-.*"
          "ext-ms-.*"
        POST_EXCLUDE_REGEXES
          ".*[\\\\/]system32[\\\\/].*"
        DESTINATION .
        COMPONENT TechLobbyRuntime
      )
    endif()
  else()
    install(TARGETS TechLobbyWin
      RUNTIME DESTINATION .
      COMPONENT TechLobbyRuntime
    )
  endif()
endif()

install(FILES
  "${GLDOZE_REPO_ROOT}/assets/JetBrainsMono-Medium.ttf"
  DESTINATION assets
  COMPONENT TechLobbyRuntime
)

install(DIRECTORY "${GLDOZE_REPO_ROOT}/assets/techlobby/"
  DESTINATION assets/techlobby
  COMPONENT TechLobbyRuntime
)

install(DIRECTORY "${GLDOZE_REPO_ROOT}/assets/sounds/"
  DESTINATION assets/sounds
  COMPONENT TechLobbyRuntime
)

if(UNIX AND NOT APPLE)
  install(TARGETS TechLobbyLinux
    RUNTIME DESTINATION .
    COMPONENT TechLobbyLinuxRuntime
  )
  install(FILES
    "${GLDOZE_REPO_ROOT}/assets/JetBrainsMono-Medium.ttf"
    DESTINATION assets
    COMPONENT TechLobbyLinuxRuntime
  )
  install(DIRECTORY "${GLDOZE_REPO_ROOT}/assets/techlobby/"
    DESTINATION assets/techlobby
    COMPONENT TechLobbyLinuxRuntime
  )
  install(DIRECTORY "${GLDOZE_REPO_ROOT}/assets/sounds/"
    DESTINATION assets/sounds
    COMPONENT TechLobbyLinuxRuntime
  )
  if(GLDOZE_MINIMAL_TECHLOBBY)
    install(TARGETS TechLobbyLinuxStatic
      RUNTIME DESTINATION .
      COMPONENT TechLobbyLinuxStaticRuntime
    )
    install(FILES
      "${GLDOZE_REPO_ROOT}/assets/JetBrainsMono-Medium.ttf"
      DESTINATION assets
      COMPONENT TechLobbyLinuxStaticRuntime
    )
    install(DIRECTORY "${GLDOZE_REPO_ROOT}/assets/techlobby/"
      DESTINATION assets/techlobby
      COMPONENT TechLobbyLinuxStaticRuntime
    )
    install(DIRECTORY "${GLDOZE_REPO_ROOT}/assets/sounds/"
      DESTINATION assets/sounds
      COMPONENT TechLobbyLinuxStaticRuntime
    )
  endif()
endif()
