if (NOT WIN32)
   message(FATAL_ERROR "This file is only for use with windows.")
endif()

# msvc compile options
if (MSVC)
   list(APPEND ASY_COMPILE_OPTS
           /Zc:__cplusplus /Zc:__STDC__
           /Zc:externC /Zc:preprocessor
           /Zc:hiddenFriend)
endif()

# alot of asymptote sources use __MSDOS__ macro for checking windows
list(APPEND ASY_MACROS WIN32_LEAN_AND_MEAN NOMINMAX __MSDOS__=1)


# set ASYMPTOTE_SYSDIR to empty string
if (CTAN_BUILD)
   list(APPEND ASY_MACROS ASYMPTOTE_SYSDIR="")
else()
   # because of how ASYMPTOTE_SYSDIR is calculated on windows,
   # this value is replaced by the what is in the registry when we launch
   # asymptote, given if ASYMPTOTE_SYSDIR is not empty
   # (empty indicates a CTAN build which uses kpsewhich for determining path)

   # hence, we can leave this value to anything non-empty.
   list(APPEND ASY_MACROS ASYMPTOTE_SYSDIR="NUL")
endif()


set(BUILD_SHARED_LIBS OFF)

# gcc/clang++ compatible validators

function(validate_gcc_compat_cxx validator_result_var gcccompat_compiler)
   execute_process(
           COMMAND ${gcccompat_compiler} "--version"
           OUTPUT_VARIABLE COMPILER_RESULT)

   if (NOT COMPILER_RESULT MATCHES
       "(clang version )|(g\\+\\+\\.exe \\(MinGW\\))|(g\\+\\+ \\(GCC\\))")
       set(${validator_result_var} FALSE PARENT_SCOPE)
   endif()
endfunction()


macro(find_compatible_gcc_compilers)
   find_program(
       GCCCOMPAT_CXX_COMPILER_FOUND
       NAMES clang++ g++
       VALIDATOR validate_gcc_compat_cxx
   )

   if (GCCCOMPAT_CXX_COMPILER_FOUND)
       message(STATUS "Found clang++/g++ at ${GCCCOMPAT_CXX_COMPILER_FOUND}")
       set(GCCCOMPAT_CXX_COMPILER_FOR_MSVC ${GCCCOMPAT_CXX_COMPILER_FOUND})
   endif()
endmacro()

# attempting to find gcc-compatible C++ compiler

if (MSVC)
   if (NOT GCCCOMPAT_CXX_COMPILER_FOR_MSVC)
       message(STATUS "GCCCOMPAT_CXX_COMPILER_FOR_MSVC not given, will attempt to find g++.exe or clang++.exe")
       find_compatible_gcc_compilers()
   endif()

   if (GCCCOMPAT_CXX_COMPILER_FOR_MSVC)
       message(STATUS "Using GCC-compatible C++ compiler at \
${GCCCOMPAT_CXX_COMPILER_FOR_MSVC} for preprocessing.")
   endif()

   if (NOT GCCCOMPAT_CXX_COMPILER_FOR_MSVC)
       message(WARNING "\
GCC-compatible C++ compiler not specified, target dependency resolution for generated files may \
not work properly. If you are looking for a GCC-compatible C++ compiler on windows for preprocessing, \
we recommend the LLVM toolchain. You can find LLVM at \
\
https://releases.llvm.org/download.html \
\
or through msys2. After that, re-run cmake with either \
-DGCCCOMPAT_CXX_COMPILER_FOR_MSVC=<path to clang++.exe> \
or if running msvc/* presets, with GCCCOMPAT_CXX_COMPILER_FOR_MSVC \
environment variable set to the path \
to clang++.exe.")
   endif()
endif()


# additional win32 api libraries
list(APPEND ASY_STATIC_LIBARIES Shlwapi Shell32 Ws2_32)

# RC file
set(ASY_WIN_RESOURCE_DIR ${ASY_RESOURCE_DIR}/windows)
list(APPEND ASY_WIN_RC_FILE ${ASY_WIN_RESOURCE_DIR}/asy.rc)

# Minimum Windows version - for now, pinning on windows 10,
# since that is currently the minimum supported version by Microsoft
# See https://learn.microsoft.com/en-us/windows/win32/winprog/using-the-windows-headers

set(ASY_WIN32_WINVER_VERSION 0x0A00)
list(APPEND ASY_MACROS _WIN32_WINNT=${ASY_WIN32_WINVER_VERSION})