cmake_minimum_required(VERSION 3.20)
project(SailorMoonWindowsFrontend LANGUAGES C CXX)
if(POLICY CMP0091)
  cmake_policy(SET CMP0091 NEW)
endif()
set(CMAKE_C_STANDARD 17)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
if(MSVC)
  set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
endif()
get_filename_component(SAILOR_MOON_FRONTEND_ROOT "${CMAKE_CURRENT_LIST_DIR}/../.." ABSOLUTE)
get_filename_component(SAILOR_MOON_PROJECT_ROOT "${SAILOR_MOON_FRONTEND_ROOT}/.." ABSOLUTE)
set(SAILOR_MOON_GAMEPAD_DIR "${SAILOR_MOON_FRONTEND_ROOT}/third_party/sailor_moon-gamepad")
set(SAILOR_MOON_SDL_SOURCE_DIR "" CACHE PATH "Explicit local SDL3 source; no network fetch")
set(SAILOR_MOON_CORE_LIBRARY "" CACHE FILEPATH "Current complete Sailor Moon STATIC archive")
set(SAILOR_MOON_CORE_LIBRARY_SHA256 "" CACHE STRING "Selected archive SHA256")
set(SAILOR_MOON_CORE_RECEIPT "" CACHE FILEPATH "Current native inventory/member/symbol authority")
set(SAILOR_MOON_CORE_RECEIPT_SHA256 "" CACHE STRING "Current authority SHA256")
foreach(required SAILOR_MOON_CORE_LIBRARY SAILOR_MOON_CORE_RECEIPT)
  if(NOT EXISTS "${${required}}" OR "${${required}_SHA256}" STREQUAL "")
    message(FATAL_ERROR "Supply ${required} and exact _SHA256 from current native authority")
  endif()
  file(SHA256 "${${required}}" actual_hash)
  if(NOT actual_hash STREQUAL "${${required}_SHA256}")
    message(FATAL_ERROR "Current authority hash mismatch: ${required}")
  endif()
endforeach()
add_library(sailor_moon_current_core STATIC IMPORTED GLOBAL)
set_target_properties(sailor_moon_current_core PROPERTIES IMPORTED_LOCATION "${SAILOR_MOON_CORE_LIBRARY}")
if(NOT EXISTS "${SAILOR_MOON_SDL_SOURCE_DIR}/CMakeLists.txt")
  message(FATAL_ERROR "SAILOR_MOON_SDL_SOURCE_DIR must name explicit local SDL3 source")
endif()
set(SDL_SHARED OFF CACHE BOOL "" FORCE)
set(SDL_STATIC ON CACHE BOOL "" FORCE)
set(SDL_TEST_LIBRARY OFF CACHE BOOL "" FORCE)
set(SDL_TESTS OFF CACHE BOOL "" FORCE)
set(SDL_EXAMPLES OFF CACHE BOOL "" FORCE)
set(SDL_INSTALL OFF CACHE BOOL "" FORCE)
add_subdirectory("${SAILOR_MOON_SDL_SOURCE_DIR}" "${CMAKE_BINARY_DIR}/local-sdl" EXCLUDE_FROM_ALL)
set(SAILOR_MOON_AUDIO_SOURCES sailor_moon_audio_output_dsound_win32.c sailor_moon_audio_resampler.c)
set(SAILOR_MOON_GAMEPAD_SOURCE "${SAILOR_MOON_GAMEPAD_DIR}/sailor_moon_gamepad_input_win32.c")
function(sailor_moon_host_options target)
  target_include_directories(${target} PRIVATE "${CMAKE_CURRENT_LIST_DIR}" "${CMAKE_CURRENT_LIST_DIR}/../common"
    "${SAILOR_MOON_GAMEPAD_DIR}" "${SAILOR_MOON_FRONTEND_ROOT}/core-api" "${SAILOR_MOON_PROJECT_ROOT}/static-core/include")
  target_compile_definitions(${target} PRIVATE UNICODE _UNICODE WIN32_LEAN_AND_MEAN NOMINMAX _CRT_SECURE_NO_WARNINGS)
  if(MSVC)
    target_compile_options(${target} PRIVATE /W4 /WX /experimental:deterministic)
    target_link_options(${target} PRIVATE $<$<CONFIG:Release>:/Brepro>)
  else()
    target_compile_options(${target} PRIVATE -Wall -Wextra -Wpedantic)
  endif()
endfunction()
add_executable(Launcher WIN32 sailor_moon_launcher_win32.c sailor_moon_app_core.c launcher_version.rc
  ${SAILOR_MOON_AUDIO_SOURCES} sailor_moon_frontend_settings_win32.c ../common/sailor_moon_input_latch.c ${SAILOR_MOON_GAMEPAD_SOURCE})
sailor_moon_host_options(Launcher)
if(MINGW)
  # Use the Unicode Windows application entry point.
  target_link_options(Launcher PRIVATE -municode -static -static-libgcc -static-libstdc++)
endif()
target_link_libraries(Launcher PRIVATE sailor_moon_current_core SDL3::SDL3-static
  user32 gdi32 comdlg32 comctl32 shell32 dsound dxguid winmm)
set_target_properties(Launcher PROPERTIES OUTPUT_NAME "Launcher" RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_BINARY_DIR}/release")
add_custom_command(TARGET Launcher POST_BUILD
  COMMAND "${CMAKE_COMMAND}" -E make_directory "$<TARGET_FILE_DIR:Launcher>/Rom" "$<TARGET_FILE_DIR:Launcher>/Saves" "$<TARGET_FILE_DIR:Launcher>/Screenshots"
  COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${SAILOR_MOON_FRONTEND_ROOT}/README.txt" "$<TARGET_FILE_DIR:Launcher>/README.txt"
  COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${SAILOR_MOON_FRONTEND_ROOT}/VERSION.txt" "$<TARGET_FILE_DIR:Launcher>/VERSION.txt"
  COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${SAILOR_MOON_FRONTEND_ROOT}/THIRD-PARTY-NOTICES.txt" "$<TARGET_FILE_DIR:Launcher>/THIRD-PARTY-NOTICES.txt"
  COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${SAILOR_MOON_FRONTEND_ROOT}/licenses/SDL-LICENSE.txt" "$<TARGET_FILE_DIR:Launcher>/SDL-LICENSE.txt" VERBATIM)
