# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#
# =============================================================================
# FetchOpenSSL.cmake  (only included when WITH_SSL=ON)
#
# OpenSSL 3.x remains the default bundled dependency for the C++ client.
#
# By default, a fixed OpenSSL source release is downloaded, checksum-verified,
# built as shared libraries, and installed under ${CMAKE_BINARY_DIR}/_deps.
# Set IOTDB_OPENSSL_FROM_SOURCE=OFF to opt into a compatible system OpenSSL.
#
# Side effects:
#   Defines imported targets OpenSSL::SSL / OpenSSL::Crypto via find_package
#   so callers can just link against them.
# =============================================================================

# Version built from source by default. Named distinctly
# from find_package's OPENSSL_VERSION output variable to avoid collisions.
set(OPENSSL_FALLBACK_VERSION "3.5.8"
    CACHE STRING "OpenSSL version built from source when no system OpenSSL is found")
set(OPENSSL_FALLBACK_SHA256
    "a8f84a39918ec6415ce765d9b429d313ba97b8143169c172e734b9514464f5b2"
    CACHE STRING "SHA-256 checksum of the pinned OpenSSL source archive")

# Build OpenSSL from source even if a system one exists, making release
# packages independent of the build host's OpenSSL installation.
option(IOTDB_OPENSSL_FROM_SOURCE
        "Ignore any system OpenSSL and build OpenSSL ${OPENSSL_FALLBACK_VERSION} from source" ON)

if(NOT IOTDB_OPENSSL_FROM_SOURCE)
    find_package(OpenSSL QUIET)
    if(OpenSSL_FOUND)
        message(STATUS "[OpenSSL] using system OpenSSL ${OPENSSL_VERSION}")
        return()
    endif()
endif()

# --- Build the pinned OpenSSL source release ---------------------------------
set(_ossl_tarname "openssl-${OPENSSL_FALLBACK_VERSION}.tar.gz")
set(_ossl_tarball "${IOTDB_OS_DEPS_DIR}/${_ossl_tarname}")

set(_ossl_download_required ON)
if(EXISTS "${_ossl_tarball}")
    file(SHA256 "${_ossl_tarball}" _ossl_existing_sha256)
    if(_ossl_existing_sha256 STREQUAL "${OPENSSL_FALLBACK_SHA256}")
        set(_ossl_download_required OFF)
    elseif(IOTDB_OFFLINE)
        message(FATAL_ERROR
                "[OpenSSL] checksum mismatch for offline archive ${_ossl_tarball}: "
                "expected ${OPENSSL_FALLBACK_SHA256}, got ${_ossl_existing_sha256}")
    else()
        message(STATUS "[OpenSSL] replacing archive with an invalid checksum")
        file(REMOVE "${_ossl_tarball}")
    endif()
endif()

if(_ossl_download_required)
    if(IOTDB_OFFLINE)
        message(FATAL_ERROR
                "[OpenSSL] IOTDB_OFFLINE=ON but ${_ossl_tarname} is missing in ${IOTDB_OS_DEPS_DIR}.")
    endif()
    set(_ossl_url
        "https://github.com/openssl/openssl/releases/download/openssl-${OPENSSL_FALLBACK_VERSION}/${_ossl_tarname}")
    message(STATUS "[OpenSSL] downloading ${_ossl_url}")
    file(DOWNLOAD "${_ossl_url}" "${_ossl_tarball}"
            SHOW_PROGRESS TLS_VERIFY ON
            EXPECTED_HASH "SHA256=${OPENSSL_FALLBACK_SHA256}" STATUS _st)
    list(GET _st 0 _code)
    if(NOT _code EQUAL 0)
        list(GET _st 1 _msg)
        file(REMOVE "${_ossl_tarball}")
        message(FATAL_ERROR "[OpenSSL] download failed: ${_msg}")
    endif()
endif()

set(_ossl_root  "${CMAKE_BINARY_DIR}/_deps/openssl")
set(_ossl_src   "${_ossl_root}/src/openssl-${OPENSSL_FALLBACK_VERSION}")
set(_ossl_inst  "${_ossl_root}/install")
set(_ossl_stamp "${_ossl_root}/.built-${OPENSSL_FALLBACK_VERSION}")

if(NOT EXISTS "${_ossl_stamp}")
    file(REMOVE_RECURSE "${_ossl_root}/src")
    file(MAKE_DIRECTORY "${_ossl_root}/src")
    message(STATUS "[OpenSSL] extracting ${_ossl_tarball}")
    file(ARCHIVE_EXTRACT INPUT "${_ossl_tarball}" DESTINATION "${_ossl_root}/src")

    message(STATUS "[OpenSSL] configuring -> ${_ossl_inst}")
    if(WIN32)
        # Git for Windows also ships a minimal Perl, but it lacks modules required by OpenSSL.
        find_program(_ossl_perl NAMES perl.exe perl
                PATHS "C:/Strawberry/perl/bin" NO_DEFAULT_PATH)
        if(NOT _ossl_perl)
            find_program(_ossl_perl NAMES perl.exe perl REQUIRED)
        endif()
        find_program(_vswhere NAMES vswhere.exe
                PATHS "$ENV{ProgramFiles}/Microsoft Visual Studio/Installer"
                      "C:/Program Files (x86)/Microsoft Visual Studio/Installer")
        if(NOT _vswhere)
            message(FATAL_ERROR "[OpenSSL] vswhere.exe was not found")
        endif()
        if(CMAKE_GENERATOR MATCHES "Visual Studio ([0-9]+)")
            set(_vs_major "${CMAKE_MATCH_1}")
            math(EXPR _vs_next_major "${_vs_major} + 1")
            set(_vs_range "[${_vs_major}.0,${_vs_next_major}.0)")
        else()
            set(_vs_range "[15.0,19.0)")
        endif()
        execute_process(
                COMMAND "${_vswhere}" -latest -products * -version "${_vs_range}"
                        -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64
                        -property installationPath
                OUTPUT_VARIABLE _vs_install OUTPUT_STRIP_TRAILING_WHITESPACE
                RESULT_VARIABLE _rc)
        if(NOT _rc EQUAL 0 OR NOT _vs_install)
            message(FATAL_ERROR "[OpenSSL] a matching Visual Studio C++ toolchain was not found")
        endif()
        file(TO_NATIVE_PATH "${_vs_install}/VC/Auxiliary/Build/vcvars64.bat" _vcvars)
        file(TO_NATIVE_PATH "${_ossl_inst}" _ossl_inst_native)
        file(TO_NATIVE_PATH "${_ossl_src}" _ossl_src_native)
        file(TO_NATIVE_PATH "${_ossl_perl}" _ossl_perl_native)
        set(_ossl_build_script "${_ossl_root}/build-openssl.cmd")
        file(WRITE "${_ossl_build_script}"
                "@echo on\r\n"
                "call \"${_vcvars}\"\r\n"
                "if errorlevel 1 exit /b %errorlevel%\r\n"
                "cd /d \"${_ossl_src_native}\"\r\n"
                "\"${_ossl_perl_native}\" Configure VC-WIN64A --prefix=\"${_ossl_inst_native}\" --openssldir=\"${_ossl_inst_native}\\ssl\" shared no-tests no-asm\r\n"
                "if errorlevel 1 exit /b %errorlevel%\r\n"
                "nmake\r\n"
                "if errorlevel 1 exit /b %errorlevel%\r\n"
                "nmake install_sw\r\n")
        execute_process(COMMAND cmd /d /c "${_ossl_build_script}" RESULT_VARIABLE _rc)
        if(NOT _rc EQUAL 0)
            message(FATAL_ERROR "[OpenSSL] Windows source build failed (rc=${_rc})")
        endif()
    else()
        include(ProcessorCount)
        ProcessorCount(_jobs)
        if(_jobs LESS 1)
            set(_jobs 1)
        endif()
        execute_process(
                COMMAND ./config --prefix=${_ossl_inst} --openssldir=${_ossl_inst}/ssl shared no-tests
                WORKING_DIRECTORY "${_ossl_src}"
                RESULT_VARIABLE _rc)
        if(NOT _rc EQUAL 0)
            message(FATAL_ERROR "[OpenSSL] config failed (rc=${_rc})")
        endif()
        message(STATUS "[OpenSSL] building (-j${_jobs})")
        execute_process(
                COMMAND make -j${_jobs}
                WORKING_DIRECTORY "${_ossl_src}"
                RESULT_VARIABLE _rc)
        if(NOT _rc EQUAL 0)
            message(FATAL_ERROR "[OpenSSL] make failed (rc=${_rc})")
        endif()
        execute_process(
                COMMAND make install_sw
                WORKING_DIRECTORY "${_ossl_src}"
                RESULT_VARIABLE _rc)
        if(NOT _rc EQUAL 0)
            message(FATAL_ERROR "[OpenSSL] make install_sw failed (rc=${_rc})")
        endif()
    endif()
    file(TOUCH "${_ossl_stamp}")
endif()

if(APPLE)
    # OpenSSL's Darwin build records its absolute installation prefix in each dylib. Rewrite the
    # IDs before iotdb_session links against them so both the client and libssl resolve the bundled
    # libraries relative to the package's lib/ directory.
    find_program(_install_name_tool NAMES install_name_tool REQUIRED)
    find_program(_otool NAMES otool REQUIRED)
    find_library(_ossl_ssl_dylib NAMES ssl
            PATHS "${_ossl_inst}/lib" "${_ossl_inst}/lib64" NO_DEFAULT_PATH)
    find_library(_ossl_crypto_dylib NAMES crypto
            PATHS "${_ossl_inst}/lib" "${_ossl_inst}/lib64" NO_DEFAULT_PATH)
    if(NOT _ossl_ssl_dylib OR NOT _ossl_crypto_dylib)
        message(FATAL_ERROR "[OpenSSL] built Darwin dylibs were not found")
    endif()
    get_filename_component(_ossl_ssl_real "${_ossl_ssl_dylib}" REALPATH)
    get_filename_component(_ossl_crypto_real "${_ossl_crypto_dylib}" REALPATH)
    get_filename_component(_ossl_ssl_name "${_ossl_ssl_real}" NAME)
    get_filename_component(_ossl_crypto_name "${_ossl_crypto_real}" NAME)

    execute_process(
            COMMAND "${_install_name_tool}" -id "@rpath/${_ossl_ssl_name}" "${_ossl_ssl_real}"
            RESULT_VARIABLE _rc)
    if(NOT _rc EQUAL 0)
        message(FATAL_ERROR "[OpenSSL] failed to make the libssl install name relocatable")
    endif()
    execute_process(
            COMMAND "${_install_name_tool}" -id "@rpath/${_ossl_crypto_name}" "${_ossl_crypto_real}"
            RESULT_VARIABLE _rc)
    if(NOT _rc EQUAL 0)
        message(FATAL_ERROR "[OpenSSL] failed to make the libcrypto install name relocatable")
    endif()

    execute_process(COMMAND "${_otool}" -L "${_ossl_ssl_real}"
            OUTPUT_VARIABLE _ossl_ssl_dependencies RESULT_VARIABLE _rc)
    if(NOT _rc EQUAL 0)
        message(FATAL_ERROR "[OpenSSL] failed to inspect libssl dependencies")
    endif()
    string(REGEX MATCH "[^\n\t ]*libcrypto[^\n\t ]*\\.dylib"
            _ossl_crypto_dependency "${_ossl_ssl_dependencies}")
    if(NOT _ossl_crypto_dependency)
        message(FATAL_ERROR "[OpenSSL] libssl does not reference the expected libcrypto dylib")
    endif()
    if(NOT _ossl_crypto_dependency STREQUAL "@rpath/${_ossl_crypto_name}")
        execute_process(
                COMMAND "${_install_name_tool}" -change "${_ossl_crypto_dependency}"
                        "@rpath/${_ossl_crypto_name}" "${_ossl_ssl_real}"
                RESULT_VARIABLE _rc)
        if(NOT _rc EQUAL 0)
            message(FATAL_ERROR "[OpenSSL] failed to make the libssl dependency relocatable")
        endif()
    endif()
endif()

set(OPENSSL_ROOT_DIR "${_ossl_inst}" CACHE PATH "OpenSSL root" FORCE)
set(OPENSSL_USE_STATIC_LIBS OFF)
find_package(OpenSSL REQUIRED)
message(STATUS "[OpenSSL] built locally (shared) at ${OPENSSL_ROOT_DIR}")
