name: Build GoodbyeDPI

on:
  push:
    paths:
      - 'src/**'
  pull_request:
    paths:
      - 'src/**'
  workflow_dispatch:

env:
  WINDIVERT_URL: https://reqrypt.org/download/WinDivert-2.2.0-D.zip
  WINDIVERT_NAME: WinDivert-2.2.0-D.zip
  WINDIVERT_BASENAME: WinDivert-2.2.0-D
  WINDIVERT_SHA256: 1d461cfdfa7ba88ebcfbb3603b71b703e9f72aba8aeff99a75ce293e6f89d2ba

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Declare short commit variable
        id: vars
        run: |
          echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT

      - name: Install MinGW-w64
        run: >
          sudo rm /var/lib/man-db/auto-update &&
          sudo DEBIAN_FRONTEND=noninteractive XZ_DEFAULTS="-T0" XZ_OPT="-T0" eatmydata
          apt install -y --no-install-recommends gcc-mingw-w64

      - name: Download WinDivert from cache
        id: windivert-cache
        uses: actions/cache@v4
        with:
          path: ${{ env. WINDIVERT_NAME }}
          key: ${{ env. WINDIVERT_SHA256 }}

      - name: Download WinDivert from the website
        if: steps.windivert-cache.outputs.cache-hit != 'true'
        run: >
          wget ${{ env. WINDIVERT_URL }} &&
          (echo ${{ env. WINDIVERT_SHA256 }} ${{ env. WINDIVERT_NAME }} | sha256sum -c)

      - name: Unpack WinDivert
        run: unzip ${{ env. WINDIVERT_NAME }}

      - name: Compile x86_64
        run: >
          cd src && make clean &&
          make CPREFIX=x86_64-w64-mingw32- BIT64=1 WINDIVERTHEADERS=../${{ env.WINDIVERT_BASENAME }}/include WINDIVERTLIBS=../${{ env.WINDIVERT_BASENAME }}/x64 -j4

      - name: Prepare x86_64 directory
        run: |
          mkdir goodbyedpi_x86_64_${{ steps.vars.outputs.sha_short }}
          cp src/goodbyedpi.exe ${{ env.WINDIVERT_BASENAME }}/x64/*.{dll,sys} goodbyedpi_x86_64_${{ steps.vars.outputs.sha_short }}

      - name: Upload output file x86_64
        uses: actions/upload-artifact@v4
        with:
          name: goodbyedpi_x86_64_${{ steps.vars.outputs.sha_short }}
          path: goodbyedpi_x86_64_${{ steps.vars.outputs.sha_short }}

      - name: Compile i686
        run: >
          cd src && make clean &&
          make CPREFIX=i686-w64-mingw32- WINDIVERTHEADERS=../${{ env.WINDIVERT_BASENAME }}/include WINDIVERTLIBS=../${{ env.WINDIVERT_BASENAME }}/x86 -j4

      - name: Prepare x86 directory
        run: |
          mkdir goodbyedpi_x86_${{ steps.vars.outputs.sha_short }}
          cp src/goodbyedpi.exe ${{ env.WINDIVERT_BASENAME }}/x86/*.{dll,sys} goodbyedpi_x86_${{ steps.vars.outputs.sha_short }}

      - name: Upload output file x86
        uses: actions/upload-artifact@v4
        with:
          name: goodbyedpi_x86_${{ steps.vars.outputs.sha_short }}
          path: goodbyedpi_x86_${{ steps.vars.outputs.sha_short }}