name: Build Win64 3proxy with MSVC

on:
  release:
    types: [published]
  workflow_dispatch:

permissions:
  contents: read

jobs:
  ci:
    permissions:
      contents: write
      id-token: write
      attestations: write
    name: "${{ matrix.target }}"
    strategy:
      matrix:
        target:
          - windows-2022
    runs-on: ${{ matrix.target }}
    steps:
    - uses: actions/checkout@v7
#    - name: configure
#      run: ./configure
    - name: set date
      run: |
       $NOW = Get-Date -Format "yyMMddHHmmss"
       $RELEASE = Get-Content -Path "RELEASE" -Raw
       echo "NOW=$NOW" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
       echo "RELEASE=$RELEASE" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
       echo "VERSION=/D `"VERSION=\`"3proxy-$RELEASE\`"`"" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
       echo "BUILDDATE=/D `"BUILDDATE=\`"$NOW\`"`"" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
    - name: install packages
      run: vcpkg install pcre2:x64-windows-static wolfssl:x64-windows-static
    - name: Add msbuild to PATH
      uses: microsoft/setup-msbuild@v3
    - name: make Windows MSVC
      shell: cmd
      run: |
       call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat"
       D:
       cd "D:/a/3proxy/3proxy"
       set "LIB=%LIB%;c:/vcpkg/installed/x64-windows-static/lib"
       set "INCLUDE=%INCLUDE%;c:/vcpkg/installed/x64-windows-static/include"
       echo "volatile char VerSion[]=^"3APA3A-3proxy-Internal-Build: 3proxy-%RELEASE%-%NOW%\r\nCode certificate: https://3proxy.org/3proxy.cer\r\n^";" >>src/3proxy.c
       echo %NOW% / %RELEASE% / %BUILDDATE% / %VERSION%
       nmake /F Makefile.msvc WOLFSSL=1
    - name: Decode Certificate
      shell: pwsh
      run: |
       $pfx_cert_byte = [System.Convert]::FromBase64String("${{ secrets.WINDOWS_CERTIFICATE }}")
       [System.IO.File]::WriteAllBytes("${{ github.workspace }}\cert.pfx", $pfx_cert_byte)
    - name: Extract public certificate
      shell: pwsh
      env:
       CERT_PASSWORD: ${{ secrets.WINDOWS_CERTIFICATE_PASSWORD }}
      run: |
       $cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2("${{ github.workspace }}\cert.pfx", "$env:CERT_PASSWORD")
       [System.IO.File]::WriteAllBytes("${{ github.workspace }}\3proxy.crt", $cert.Export("Cert"))
    - name: Sign
      shell: pwsh
      env:
       CERT_PASSWORD: ${{ secrets.WINDOWS_CERTIFICATE_PASSWORD }}
      run: |
       $signtool = (Get-ChildItem "C:\Program Files (x86)\Windows Kits\10\bin\*\x64\signtool.exe" | Sort-Object { [version]$_.Directory.Parent.Name } -Descending | Select-Object -First 1).FullName
       Get-ChildItem bin\*.exe, bin\*.dll | ForEach-Object { & $signtool sign /f "${{ github.workspace }}\cert.pfx" /p "$env:CERT_PASSWORD" /tr http://timestamp.digicert.com /td sha256 /fd sha256 $_.FullName }
    - name: make dist dir
      shell: cmd
      run: |
       mkdir dist
       mkdir dist\3proxy
       mkdir dist\3proxy\bin64
       mkdir dist\3proxy\cfg
       mkdir dist\3proxy\cfg\sql
       mkdir dist\3proxy\doc
       mkdir dist\3proxy\doc\ru
       mkdir dist\3proxy\doc\html
       mkdir dist\3proxy\doc\html\plugins
       mkdir dist\3proxy\doc\html\man5
       mkdir dist\3proxy\doc\html\man8
       mkdir dist\3proxy\doc\html\devel
       copy bin\3proxy.exe dist\3proxy\bin64\
       copy bin\*.dll dist\3proxy\bin64\
       copy bin\3proxy_crypt.exe  dist\3proxy\bin64\
       copy cfg\*.* dist\3proxy\cfg\
       copy cfg\sql\*.*  dist\3proxy\cfg\sql\
       copy doc\ru\*.*  dist\3proxy\doc\ru\
       copy doc\html\*.* dist\3proxy\doc\html\
       copy doc\html\plugins\*.* dist\3proxy\doc\html\plugins\
       copy doc\html\man8\*.* dist\3proxy\doc\html\man8\
       copy doc\html\man5\*.* dist\3proxy\doc\html\man5\
       copy doc\html\devel\*.* dist\3proxy\doc\html\devel\
       copy copying dist\3proxy\
       copy authors dist\3proxy\
       copy README.md dist\3proxy\
       copy rus.3ps dist\3proxy\
       copy 3proxy.crt dist\3proxy\
    - name: Get artifact
      uses: actions/upload-artifact@v7
      with:
       name: "3proxy-${{ env.RELEASE }}-x64"
       path: dist/
    - name: Create zip
      if: github.event_name == 'release'
      shell: pwsh
      run: Compress-Archive -Path dist/* -DestinationPath 3proxy-${{ env.RELEASE }}-x64.zip
    - name: Checksums and detached signature
      if: github.event_name == 'release'
      shell: bash
      env:
       GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }}
       GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }}
      run: |
       if [ -z "$GPG_PRIVATE_KEY" ]; then echo "GPG_PRIVATE_KEY is not set"; exit 1; fi
       printf '%s' "$GPG_PRIVATE_KEY" | gpg --batch --import
       KEYID=$(gpg --list-secret-keys --with-colons | awk -F: '/^sec:/{print $5; exit}')
       sha256sum *.zip > SHA256SUMS-win-x64
       gpg --batch --yes --pinentry-mode loopback --passphrase "$GPG_PASSPHRASE" \
           -u "$KEYID" --armor --detach-sign SHA256SUMS-win-x64
       sha256sum -c SHA256SUMS-win-x64
    - name: Attest build provenance
      if: github.event_name == 'release'
      uses: actions/attest-build-provenance@v2
      with:
        subject-path: |
          *.zip
    - name: Upload to release
      if: github.event_name == 'release'
      shell: bash
      env:
       GH_TOKEN: ${{ github.token }}
       TAG: ${{ github.event.release.tag_name }}
      run: gh release upload "$TAG" *.zip SHA256SUMS-win-x64 SHA256SUMS-win-x64.asc
