set(SCRIPT_PATH "${CURRENT_INSTALLED_DIR}/share/qtbase")
include("${SCRIPT_PATH}/qt_install_submodule.cmake")

set(${PORT}_PATCHES 
      "clang-cl.patch"
      "cross-build.diff"
      "disable-host-pkgconfig.diff"
      #"osx-sdk-info.diff"
      "pdf-system-libjpeg.diff"
      "pdf-system-libpng.diff"
      "pdf-system-abseil.diff"
      "pkg-config-sorted-libs.diff"
      #"pkg-config.diff"
      "rpath.diff"
      "include-dir-order.diff"
      "node-wrapper-diagnostics.diff"
)

set(qtwebengine_target "${VCPKG_TARGET_TRIPLET}-${VCPKG_CMAKE_SYSTEM_NAME}")
if(VCPKG_CROSSCOMPILING)
    if(NOT qtwebengine_host STREQUAL qtwebengine_target)
        # Port limitation: qtwebengine-chromium builds and runs host tools.
        message(WARNING "Building for ${TARGET_TRIPLET} on ${HOST_TRIPLET} is unsupported.")
    endif()
    if(FEATURES STREQUAL "core")
        set(VCPKG_POLICY_EMPTY_PACKAGE enabled)
        return()
    endif()
else()
    file(WRITE "${CURRENT_PACKAGES_DIR}/share/${PORT}/vcpkg-port-config.cmake" "set(qtwebengine_host \"${qtwebengine_target}\")\n")
    if(FEATURES STREQUAL "core")
        # Install only the custom gn executable.
        set(VCPKG_BUILD_TYPE "release")
        set(VCPKG_POLICY_EMPTY_INCLUDE_FOLDER enabled)
        qt_install_submodule(
            CONFIGURE_OPTIONS
                -DBUILD_ONLY_GN=ON
            CONFIGURE_OPTIONS_MAYBE_UNUSED
                INSTALL_MKSPECSDIR
                QT_BUILD_BENCHMARKS
                QT_BUILD_EXAMPLES
                QT_BUILD_TESTS
                QT_MKSPECS_DIR
                QT_USE_DEFAULT_CMAKE_OPTIMIZATION_FLAGS
        )
        qt_fixup_and_cleanup(TOOL_NAMES gn)
        qt_install_copyright("${SOURCE_PATH}")
        return()
    endif()
endif()

vcpkg_check_features(OUT_FEATURE_OPTIONS FEATURE_OPTIONS
FEATURES
    "geolocation"           FEATURE_webengine_geolocation
    "geolocation"           CMAKE_REQUIRE_FIND_PACKAGE_Qt6Positioning
    "pdf"                   FEATURE_qtpdf_build
    "proprietary-codecs"    FEATURE_webengine_proprietary_codecs
    "spellchecker"          FEATURE_webengine_spellchecker
    "webchannel"            FEATURE_webengine_webchannel
    "webchannel"            CMAKE_REQUIRE_FIND_PACKAGE_Qt6WebChannel
    "webengine"             FEATURE_qtwebengine_build
INVERTED_FEATURES
    "geolocation"           CMAKE_DISABLE_FIND_PACKAGE_Qt6Positioning
    "webchannel"            CMAKE_DISABLE_FIND_PACKAGE_Qt6WebChannel
)

if(VCPKG_TARGET_IS_OSX AND "spellchecker" IN_LIST FEATURES)
    list(APPEND FEATURE_OPTIONS "-DFEATURE_webengine_native_spellchecker=ON")
endif()

if(VCPKG_TARGET_IS_WINDOWS)
    string(COMPARE EQUAL "${VCPKG_CRT_LINKAGE}" "static" static_runtime)
    list(APPEND FEATURE_OPTIONS "-DQT_FEATURE_static_runtime=${static_runtime}")
endif()

if(VCPKG_TARGET_IS_LINUX AND "pdf" IN_LIST FEATURES)
    list(APPEND FEATURE_OPTIONS "-DFEATURE_webengine_system_abseil=ON")
endif()

# webengine-extensions
# webengine-printing-and-pdf
# webengine-pepper-plugins
set(deactivated_features   webengine_webrtc_pipewire)
foreach(_feat IN LISTS deactivated_features)
    list(APPEND FEATURE_OPTIONS "-DFEATURE_${_feat}=OFF")
endforeach()
set(enabled_features  webengine_webrtc)
foreach(_feat IN LISTS enabled_features)
    list(APPEND FEATURE_OPTIONS "-DFEATURE_${_feat}=ON")
endforeach()

if(NOT VCPKG_TARGET_IS_WINDOWS)
    # qt_configure_add_summary_entry(ARGS "webengine-system-lcms2")
    # qt_configure_add_summary_entry(ARGS "webengine-system-libpci")
    # + ALSA and PULSEAUDIO
    # gbm, libpci ?
    set(system_libs freetype glib harfbuzz libjpeg libpng libtiff libwebp libxml minizip re2 snappy zlib)
    if(NOT VCPKG_TARGET_IS_IOS AND NOT VCPKG_TARGET_IS_OSX)
        list(APPEND system_libs icu)
    endif()
    if("pdfium" IN_LIST FEATURES)
        list(APPEND system_libs lcms2 libopenjpeg2)
    endif()
    if("webengine" IN_LIST FEATURES)
        list(APPEND system_libs ffmpeg opus)
    endif()
    foreach(_sys_lib IN LISTS system_libs)
        list(APPEND FEATURE_OPTIONS "-DFEATURE_webengine_system_${_sys_lib}=ON")
    endforeach()
    # vcpkg ports exist, but don't work with chromium
    list(APPEND FEATURE_OPTIONS "-DFEATURE_webengine_system_libevent=OFF")
    list(APPEND FEATURE_OPTIONS "-DFEATURE_webengine_system_libvpx=OFF")

    vcpkg_find_acquire_program(PKGCONFIG)
    set(ENV{PKG_CONFIG} "${PKGCONFIG}")
    list(APPEND FEATURE_OPTIONS "-DVCPKG_LOCK_FIND_PACKAGE_PkgConfig=ON")
    # Note <installed>/share/Qt6/QtBuildRepoHelpers.cmake
    list(APPEND FEATURE_OPTIONS "-DFEATURE_pkg_config=ON")
    # Note <installed>/share/Qt6BuildInternals/QtBuildInternalsExtra.cmake
    list(APPEND FEATURE_OPTIONS "-DQT_SKIP_BUILD_INTERNALS_PKG_CONFIG_FEATURE=ON")
endif()

vcpkg_find_acquire_program(FLEX)
vcpkg_find_acquire_program(BISON)

#vcpkg_find_acquire_program(GN) # Qt builds its own internal version

find_program(NODEJS
    NAMES node
    PATHS
        "${CURRENT_HOST_INSTALLED_DIR}/tools/node"
        "${CURRENT_HOST_INSTALLED_DIR}/tools/node/bin"
        ENV PATH
    NO_DEFAULT_PATH
)
if(NOT NODEJS)
    message(FATAL_ERROR "node not found! Please install it via your system package manager!")
endif()

get_filename_component(NODEJS_DIR "${NODEJS}" DIRECTORY )
vcpkg_add_to_path(PREPEND "${NODEJS_DIR}")
get_filename_component(FLEX_DIR "${FLEX}" DIRECTORY )
vcpkg_add_to_path(PREPEND "${FLEX_DIR}")
get_filename_component(BISON_DIR "${BISON}" DIRECTORY )
vcpkg_add_to_path(PREPEND "${BISON_DIR}")

function(download_distfile var url sha512)
    string(REGEX REPLACE ".*/" "" filename "${url}")
    vcpkg_download_distfile(archive
        URLS "${url}"
        FILENAME "${filename}"
        SHA512 "${sha512}"
    )
    set("${var}" "${archive}" PARENT_SCOPE)
endfunction()

download_distfile(html5lib
    "https://files.pythonhosted.org/packages/6c/dd/a834df6482147d48e225a49515aabc28974ad5a4ca3215c18a882565b028/html5lib-1.1-py2.py3-none-any.whl"
    53e828155e489176e8ea0cdc941ec6271764bbf7069b1a83c0ce8adb26694450d17d7c76b4a00a14dbb99ca203ae02b3d8c8e41953fd59499bbc8a8d4900975b
)
download_distfile(six
    "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl"
    2796b93aaac73193faeb5c93a85d23c2ae9fc4a7e57df88dc34b704a36fa62cd0b1fb5d1a74b961a23eff2467be94eb14f5f10874dfa733dc4ab59715280bbf3
)
download_distfile(webencodings
    "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl"
    2a34dbebc33a44a3691216104982b4a978a2a60b38881fc3704d04cb1da38ea2878b5ffec5ac19ac43f50d00c8d4165e05fdf6fa4363a564d8c5090411fc392d
)
x_vcpkg_get_python_packages(
    OUT_PYTHON_VAR PYTHON3
    PYTHON_VERSION 3
    PACKAGES --no-index "${html5lib}" "${six}" "${webencodings}"
)
get_filename_component(PYTHON_DIR "${PYTHON3}" DIRECTORY )
vcpkg_add_to_path(APPEND "${PYTHON_DIR}")

vcpkg_add_to_path(PREPEND "${CURRENT_HOST_INSTALLED_DIR}/tools/gperf")
set(GPERF "${CURRENT_HOST_INSTALLED_DIR}/tools/gperf/gperf${VCPKG_HOST_EXECUTABLE_SUFFIX}")

if(CMAKE_HOST_WIN32) # WIN32 HOST probably has win_flex and win_bison!
    if(NOT EXISTS "${FLEX_DIR}/flex${VCPKG_HOST_EXECUTABLE_SUFFIX}")
        file(CREATE_LINK "${FLEX}" "${FLEX_DIR}/flex${VCPKG_HOST_EXECUTABLE_SUFFIX}")
    endif()
    if(NOT EXISTS "${BISON_DIR}/BISON${VCPKG_HOST_EXECUTABLE_SUFFIX}")
        file(CREATE_LINK "${BISON}" "${BISON_DIR}/bison${VCPKG_HOST_EXECUTABLE_SUFFIX}")
    endif()
endif()

string(LENGTH "${CURRENT_BUILDTREES_DIR}" buildtree_length)
# We know that C:/buildrees/${PORT} is to long to build Release. Debug works however. Means 24 length is too much but 23 might work.
if(buildtree_length GREATER 22 AND VCPKG_TARGET_IS_WINDOWS AND NOT VCPKG_TARGET_ARCHITECTURE MATCHES "arm64")
    message(WARNING "Buildtree path '${CURRENT_BUILDTREES_DIR}' is too long.\nConsider passing --x-buildtrees-root=<shortpath> to vcpkg!\nTrying to use '${CURRENT_BUILDTREES_DIR}/../tmp'")
    set(CURRENT_BUILDTREES_DIR "${CURRENT_BUILDTREES_DIR}/../tmp") # activly avoid long path issues in CI. -> Means CI will not return logs
    cmake_path(NORMAL_PATH CURRENT_BUILDTREES_DIR)
    string(LENGTH "${CURRENT_BUILDTREES_DIR}" buildtree_length_new)
    if(buildtree_length_new GREATER 22)
         message(FATAL_ERROR "Buildtree path is too long. Build will fail! Pass --x-buildtrees-root=<shortpath> to vcpkg!")
    endif()
    file(MAKE_DIRECTORY "${CURRENT_BUILDTREES_DIR}")
endif()

set(ENV{QTWEBENGINE_GN_THREADS} "${VCPKG_CONCURRENCY}")
set(ENV{NINJAFLAGS} "-j${VCPKG_CONCURRENCY} $ENV{NINJAFLAGS}")

##### qt_install_submodule, unrolled
set(qt_plugindir ${QT6_DIRECTORY_PREFIX}plugins)
set(qt_qmldir ${QT6_DIRECTORY_PREFIX}qml)

qt_download_submodule(PATCHES ${${PORT}_PATCHES})
if(QT_UPDATE_VERSION)
    return()
endif()

if(VCPKG_TARGET_IS_LINUX AND "pdf" IN_LIST FEATURES)
    # Devendor bundled abseil: replace the bundled absl/ directory with a
    # symlink to the vcpkg-installed headers.  This guarantees that every
    # #include path — both explicit "third_party/abseil-cpp/absl/..."
    # (via -I <chromium_root>) and internal "absl/..." (via -isystem
    # <prefix>/include) — resolves to the same installed files, preventing
    # API mismatches between the old bundled and new vcpkg-installed version.
    set(_chromium_absl "${SOURCE_PATH}/src/3rdparty/chromium/third_party/abseil-cpp")
    file(REMOVE_RECURSE "${_chromium_absl}/absl")
    file(CREATE_LINK "${CURRENT_INSTALLED_DIR}/include/absl" "${_chromium_absl}/absl" SYMBOLIC)
    unset(_chromium_absl)
endif()

qt_cmake_configure(
    DISABLE_PARALLEL_CONFIGURE # due to in-source changes.
    OPTIONS
        ${FEATURE_OPTIONS}
        "-DGPerf_EXECUTABLE=${GPERF}"
        "-DBISON_EXECUTABLE=${BISON}"
        "-DFLEX_EXECUTABLE=${FLEX}"
        "-DNodejs_EXECUTABLE=${NODEJS}"
        "-DPython3_EXECUTABLE=${PYTHON3}"
        -DQT_FEATURE_webengine_jumbo_build=0
        -DVCPKG_LOCK_FIND_PACKAGE_BISON=ON
        -DVCPKG_LOCK_FIND_PACKAGE_FLEX=ON
        -DVCPKG_LOCK_FIND_PACKAGE_GPerf=ON
        -DVCPKG_LOCK_FIND_PACKAGE_Ninja=ON
        -DVCPKG_LOCK_FIND_PACKAGE_Nodejs=ON
    OPTIONS_MAYBE_UNUSED
        FEATURE_webengine_webrtc
)

vcpkg_backup_env_variables(VARS PKG_CONFIG_PATH)
file(GLOB target_args_gn RELATIVE "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel/src/core/Release" "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel/src/core/Release/*/args.gn")
if(NOT VCPKG_BUILD_TYPE)
    block(SCOPE_FOR VARIABLES)
    set(VCPKG_BUILD_TYPE debug)
    if(VCPKG_TARGET_IS_LINUX AND EXISTS "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg/src/core/Debug/${target_args_gn}")
        file(APPEND "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg/src/core/Debug/${target_args_gn}" "\ngcc_target_rpath=\"\\\${ORIGIN}:${CURRENT_INSTALLED_DIR}/debug/lib\"\n")
    endif()
    vcpkg_host_path_list(PREPEND ENV{PKG_CONFIG_PATH} "${CURRENT_INSTALLED_DIR}/debug/lib/pkgconfig" "${CURRENT_INSTALLED_DIR}/share/pkgconfig")
    vcpkg_cmake_install(ADD_BIN_TO_PATH)
    endblock()
endif()
vcpkg_restore_env_variables(VARS PKG_CONFIG_PATH)
block(SCOPE_FOR VARIABLES)
set(VCPKG_BUILD_TYPE release)
if(VCPKG_TARGET_IS_LINUX AND EXISTS "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel/src/core/Release/${target_args_gn}")
    file(APPEND "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel/src/core/Release/${target_args_gn}" "\ngcc_target_rpath=\"\\\${ORIGIN}:${CURRENT_INSTALLED_DIR}/lib\"\n")
endif()
vcpkg_host_path_list(PREPEND ENV{PKG_CONFIG_PATH} "${CURRENT_INSTALLED_DIR}/lib/pkgconfig" "${CURRENT_INSTALLED_DIR}/share/pkgconfig")
vcpkg_cmake_install(ADD_BIN_TO_PATH)
endblock()
vcpkg_restore_env_variables(VARS PKG_CONFIG_PATH)

# Unroll response file references.
# Escape quotes in a way which survives vcpkg_cmake_config_fixup().
file(GLOB cmake_target_files "${CURRENT_PACKAGES_DIR}/share/Qt6*/Qt6*Targets.cmake" "${CURRENT_PACKAGES_DIR}/debug/share/Qt6*/Qt6*Targets.cmake")
foreach(file IN LISTS cmake_target_files)
    file(READ "${file}" haystack)
    while(haystack MATCHES "@([^>]*[.]rsp)")
        set(response_file "${CMAKE_MATCH_1}")
        if(EXISTS "${response_file}")
            file(STRINGS "${response_file}" options)
            string(REPLACE [["]] [[${_escaped_quote_}]] options "${options}")
            list(JOIN options " " replacement)
        else()
            message("${Z_VCPKG_BACKCOMPAT_MESSAGE_LEVEL}" "No such response file: ${response_file}")
            set(replacement "")
        endif()
        string(REPLACE "@${response_file}" "${replacement}" haystack "${haystack}")
    endwhile()
    file(WRITE "${file}" [[set(_escaped_quote_ "\"")]] "\n\n${haystack}")
endforeach()

qt_fixup_and_cleanup(TOOL_NAMES gn QtWebEngineProcess qwebengine_convert_dict webenginedriver)
if("webengine" IN_LIST FEATURES)
    if(VCPKG_TARGET_IS_WINDOWS AND NOT VCPKG_BUILD_TYPE)
        file(MAKE_DIRECTORY "${CURRENT_PACKAGES_DIR}/tools/Qt6/bin/debug/")
        file(RENAME "${CURRENT_PACKAGES_DIR}/debug/bin/QtWebEngineProcessd.exe" "${CURRENT_PACKAGES_DIR}/tools/Qt6/bin/debug/QtWebEngineProcessd.exe")
        file(RENAME "${CURRENT_PACKAGES_DIR}/debug/bin/QtWebEngineProcessd.pdb" "${CURRENT_PACKAGES_DIR}/tools/Qt6/bin/debug/QtWebEngineProcessd.pdb")
    endif()
    file(RENAME "${CURRENT_PACKAGES_DIR}/resources" "${CURRENT_PACKAGES_DIR}/share/Qt6/resources") # qt.conf wants it there and otherwise the QtWebEngineProcess cannot start
endif()

qt_install_copyright("${SOURCE_PATH}")

##### qt_install_submodule
