cmake_minimum_required(VERSION 3.25)

cmake_policy(SET CMP0135 NEW)
cmake_policy(SET CMP0042 NEW)
cmake_policy(SET CMP0141 NEW)
cmake_policy(SET CMP0091 NEW)

if (WIN32)
        if (NODE_ARCH MATCHES "arm64")
                set (CMAKE_SYSTEM_VERSION 10.0.22621.0 CACHE INTERNAL "" FORCE) # Windows 11
        else()
                set (CMAKE_SYSTEM_VERSION 6.1 CACHE INTERNAL "" FORCE) # Windows 7
        endif()
        set (CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
endif()

if (WIN32)
        message("Building node module for Windows, ARCH is ${ARCH}, NODE_ARCH is ${NODE_ARCH}")
        if (NODE_ARCH MATCHES "arm64")
                message("Building node module for Windows ARM64")
                set(VCPKG_TARGET_TRIPLET "arm64-windows-custom" CACHE STRING "Vcpkg target triplet")
        else()
                message("Building node module for Windows x64")
                set(VCPKG_TARGET_TRIPLET "x64-windows-custom" CACHE STRING "Vcpkg target triplet")
        endif()                
elseif (APPLE)
        message("Building node module for macOS, arch is ${ARCH}")
        if (NODE_ARCH MATCHES "arm64")
                set(VCPKG_TARGET_TRIPLET "arm64-osx-custom" CACHE STRING "Vcpkg target triplet")
                set(CMAKE_OSX_ARCHITECTURES "arm64")
                set(CMAKE_APPLE_SILICON_PROCESSOR "arm64")
                set(CMAKE_OSX_DEPLOYMENT_TARGET "11.0") # Big Sur, first macOS to support ARM64
        else()
                set(VCPKG_TARGET_TRIPLET "x64-osx-custom" CACHE STRING "Vcpkg target triplet")
                set(CMAKE_OSX_ARCHITECTURES "x86_64")
                set(CMAKE_APPLE_SILICON_PROCESSOR "x86_64")
                set(CMAKE_OSX_DEPLOYMENT_TARGET "10.12") # High Sierra
        endif()
elseif (UNIX AND NOT APPLE AND NOT EMSCRIPTEN)
        message("Building node module for Linux, arch is ${ARCH}")
        if (NODE_ARCH MATCHES "arm64")
                set(VCPKG_TARGET_TRIPLET "arm64-linux-custom" CACHE STRING "Vcpkg target triplet")
        else()
                set(VCPKG_TARGET_TRIPLET "x64-linux-custom" CACHE STRING "Vcpkg target triplet")
        endif()
	message("Is override triplet set? ${OVERRIDE_VCPKG_TRIPLET}")
	if (OVERRIDE_VCPKG_TRIPLET)
	   message("YES")
		set(VCPKG_TARGET_TRIPLET "${OVERRIDE_VCPKG_TRIPLET}" CACHE STRING "Vcpkg target triplet" FORCE)
		set(VCPKG_HOST_TRIPLET "${OVERRIDE_VCPKG_HOST_TRIPLET}" CACHE STRING "" FORCE)
		message("Overridden triplets: ${VCPKG_TARGET_TRIPLET} ${VCPKG_HOST_TRIPLET}")
	endif()
else()
        message(FATAL_ERROR "Unsupported platform")
endif()
message("Forcing VCPKG_TARGET_TRIPLET to ${VCPKG_TARGET_TRIPLET}")

# Workaround for weird issue where EMSCRIPTEN is not detected on first run on Apple Silicon
if (NOT EMSCRIPTEN AND "${VCPKG_TARGET_TRIPLET}" MATCHES "wasm32")
    set(EMSCRIPTEN TRUE)
endif()

if (APPLE AND NOT EMSCRIPTEN)
    project(node-photochemistry LANGUAGES C CXX OBJC OBJCXX)
else()
    project(node-photochemistry LANGUAGES C CXX)
endif()

# Temporary workaround for issue where vcpkg can't find pwsh
set(CMAKE_PREFIX_PATH "${CMAKE_PREFIX_PATH};c:/Program Files/PowerShell/7")

set(PHOTOCHEMISTRY_RELATIVE_DIR "../libphotochemistry")
if ("${CMAKE_SOURCE_DIR}" MATCHES "node_modules")
        set(PHOTOCHEMISTRY_RELATIVE_DIR "../../../libphotochemistry")
endif()
include("${CMAKE_SOURCE_DIR}/${PHOTOCHEMISTRY_RELATIVE_DIR}/cmake/global_setup.cmake")

# Make symbols of included static libraries private to avoid a conflict between bundled
# jpeg-turbo v8 and linux system jpeg-turbo v6.2
if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")
    string(APPEND CMAKE_SHARED_LINKER_FLAGS " -Wl,--exclude-libs,ALL -Wl,-z,noexecstack")
endif()

include_directories(${CMAKE_JS_INC})

add_library(${PROJECT_NAME} SHARED 
        "src/node_processfiledirectory.cpp"
        "src/node_thumbnailcache.cpp"
        "src/node_falloff.cpp"
        "src/node_photochemistry.cpp"
        ${CMAKE_JS_SRC})
set_target_properties(${PROJECT_NAME} PROPERTIES
        PREFIX ""
        SUFFIX ".node"
        CXX_STANDARD 17
        LIBRARY_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}
        LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}
        RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}
        RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}
)
target_link_libraries(${PROJECT_NAME} ${CMAKE_JS_LIB})

# define NAPI_VERSION
add_definitions(-DNAPI_VERSION=8)

# Include Node-API wrappers
execute_process(COMMAND node -p "require('node-addon-api').include"
        WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
        OUTPUT_VARIABLE NODE_ADDON_API_DIR
        )
string(REGEX REPLACE "[\r\n\"]" "" NODE_ADDON_API_DIR ${NODE_ADDON_API_DIR})

target_include_directories(${PROJECT_NAME} PRIVATE ${NODE_ADDON_API_DIR})

# add photochemistry dependency
set(BUILD_SHARED_LIBS OFF)
set(WITH_GLFW OFF)
add_subdirectory(${PHOTOCHEMISTRY_RELATIVE_DIR} libphotochemistry)
target_link_libraries(${PROJECT_NAME} photochemistry)
if (WIN32)
        target_link_libraries(${PROJECT_NAME} delayimp)
endif()

if (LINUX)
        # Necessary so AppImage build can find libs at runtime
        # TODO: this breaks non-Electron use at the moment
        set_target_properties(${PROJECT_NAME} PROPERTIES
                INSTALL_RPATH "\$ORIGIN/../../../../..")
else()
        set_target_properties(${PROJECT_NAME} PROPERTIES INSTALL_RPATH "${ANGLE_LIB_ROOT}")
endif()

if(MSVC AND CMAKE_JS_NODELIB_DEF AND CMAKE_JS_NODELIB_TARGET)
# Generate node.lib
execute_process(COMMAND ${CMAKE_AR} /def:${CMAKE_JS_NODELIB_DEF} /out:${CMAKE_JS_NODELIB_TARGET} ${CMAKE_STATIC_LINKER_FLAGS})
endif()
