@echo off
setlocal

REM ==============================================================================
REM Configuration
REM ==============================================================================
set "OPENSSL_VER=3.6.0"
set "SRC_DIR=%CD%\openssl-%OPENSSL_VER%"
set "VCVARSALL=C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\Build\vcvarsall.bat"
set "STRAWBERRY_PERL_BIN=C:\Strawberry\perl\bin"

REM ==============================================================================
REM Environment checks
REM ==============================================================================
if not exist "%VCVARSALL%" (
  echo [ERROR] vcvarsall.bat not found: "%VCVARSALL%"
  exit /b 1
)

if not exist "%STRAWBERRY_PERL_BIN%\perl.exe" (
  echo [ERROR] Strawberry Perl not found at: "%STRAWBERRY_PERL_BIN%"
  exit /b 1
)

set "PATH=%STRAWBERRY_PERL_BIN%;%PATH%"

REM ==============================================================================
REM Download and extract source if needed
REM ==============================================================================
set "OPENSSL_TARBALL=openssl-%OPENSSL_VER%.tar.gz"
set "OPENSSL_URL=https://www.openssl.org/source/%OPENSSL_TARBALL%"

if not exist "%OPENSSL_TARBALL%" (
  echo [INFO] Downloading OpenSSL %OPENSSL_VER%...
  powershell -NoProfile -Command ^
    "Invoke-WebRequest -Uri '%OPENSSL_URL%' -OutFile '%OPENSSL_TARBALL%'"
)

if not exist "%SRC_DIR%" (
  echo [INFO] Extracting source...
  tar -xf "%OPENSSL_TARBALL%"
)

REM ==============================================================================
REM Jump over function definitions
REM ==============================================================================
goto :main

REM ==============================================================================
REM Build function
REM ==============================================================================
:build_arch
set "ARCH=%~1"
set "TARGET=%~2"
set "VCVARS_ARG=%~3"
set "PREFIX=%CD%\openssl-%OPENSSL_VER%-static-%ARCH%"

echo.
echo [INFO] === Building for %ARCH% (%TARGET%) ===
echo.

call "%VCVARSALL%" %VCVARS_ARG%
if errorlevel 1 exit /b 1

cd /d "%SRC_DIR%" || exit /b 1
nmake clean >nul 2>&1

set CL=/MT
set CFLAGS=/MT /O2
set LDFLAGS=

perl Configure %TARGET% no-shared no-tests --prefix=%PREFIX% --openssldir=%PREFIX%\ssl %CFLAGS% %LDFLAGS%
if errorlevel 1 exit /b 1

nmake || exit /b 1

REM After successful build
set "DIST=%CD%\dist"

if not exist "%DIST%\lib\%ARCH%" mkdir "%DIST%\lib\%ARCH%"
copy /Y "%SRC_DIR%\libcrypto.lib" "%DIST%\lib\%ARCH%\crypto.lib"
copy /Y "%SRC_DIR%\libssl.lib" "%DIST%\lib\%ARCH%\ssl.lib"

REM Copy headers only once (e.g. after x86 build)
if "%ARCH%"=="x86" (
  if not exist "%DIST%\include" mkdir "%DIST%\include"
  xcopy /E /I /Y "%SRC_DIR%\include\openssl" "%DIST%\include\openssl"
)


echo [INFO] Installed to %PREFIX%
goto :eof


REM ==============================================================================
REM Main build sequence
REM ==============================================================================
:main
call :build_arch x86 VC-WIN32 amd64_x86
call :build_arch x64 VC-WIN64A amd64
call :build_arch arm64 VC-WIN64-ARM amd64_arm64

echo.
echo [SUCCESS] All architectures built successfully.
endlocal
