name: Build
on:
  push:
    paths-ignore:
      - LICENSE
      - "*.md"
      - .vscode
      - .devcontainer
    branches:
      - main
      - dev
      - hotfix/*
      - feature/*
      - release/*
    tags:
      - v*.*.*
jobs:
  # Include arm64 if ref is a tag
  setup-matrix:
    runs-on: ubuntu-latest
    outputs:
      matrix: ${{ steps.set-matrix.outputs.matrix }}
    steps:
      - name: Set up matrix
        id: set-matrix
        run: |
          if [[ "${{ github.ref }}" == "refs/tags/"* ]]; then
            echo 'matrix=[{"runner": "ubuntu-latest", "arch": "amd64"}, {"runner": "arm64", "arch": "arm64"}]' >> $GITHUB_OUTPUT
          else
            echo 'matrix=[{"runner": "ubuntu-latest", "arch": "amd64"}]' >> $GITHUB_OUTPUT
          fi

  tarball:
    runs-on: ubuntu-latest
    needs: [setup-matrix]
    steps:
    - uses: pnpm/action-setup@v2
      with:
        version: 8
    - name: Prepare workspace
      run: rm -rf source && mkdir source
    - name: Checkout GlobalProtect-openconnect
      uses: actions/checkout@v3
      with:
        token: ${{ secrets.GH_PAT }}
        repository: yuezk/GlobalProtect-openconnect
        ref: ${{ github.ref }}
        path: source/gp
    - name: Create tarball
      run: |
        cd source/gp
        # Generate the SNAPSHOT file for non-tagged commits
        if [[ "${{ github.ref }}" != "refs/tags/"* ]]; then
          touch SNAPSHOT
        fi
        make tarball
    - name: Upload tarball
      uses: actions/upload-artifact@v3
      with:
        name: artifact-source
        if-no-files-found: error
        path: |
          source/gp/.build/tarball/*.tar.gz

  build-gp:
    needs:
    - setup-matrix
    - tarball
    strategy:
      matrix:
        os: ${{fromJson(needs.setup-matrix.outputs.matrix)}}
        package: [deb, rpm, pkg, binary]
    runs-on: ${{ matrix.os.runner }}
    name: build-gp (${{ matrix.package }}, ${{ matrix.os.arch }})
    steps:
    - name: Prepare workspace
      run: |
        rm -rf build-gp-${{ matrix.package }}
        mkdir -p build-gp-${{ matrix.package }}
    - name: Download tarball
      uses: actions/download-artifact@v3
      with:
        name: artifact-source
        path: build-gp-${{ matrix.package }}
    - name: Docker Login
      run: echo ${{ secrets.DOCKER_HUB_TOKEN }} | docker login -u ${{ secrets.DOCKER_HUB_USERNAME }} --password-stdin
    - name: Build ${{ matrix.package }} package in Docker
      run: |
        docker run --rm \
          -v $(pwd)/build-gp-${{ matrix.package }}:/${{ matrix.package }} \
          yuezk/gpdev:${{ matrix.package }}-builder
    - name: Install ${{ matrix.package }} package in Docker
      run: |
        docker run --rm \
          -e GPGUI_INSTALLED=0 \
          -v $(pwd)/build-gp-${{ matrix.package }}:/${{ matrix.package }} \
          yuezk/gpdev:${{ matrix.package }}-builder \
          bash install.sh
    - name: Upload ${{ matrix.package }} package
      uses: actions/upload-artifact@v3
      with:
        name: artifact-gp-${{ matrix.package }}-${{ matrix.os.arch }}
        if-no-files-found: error
        path: |
          build-gp-${{ matrix.package }}/artifacts/*

  build-gpgui:
    needs:
    - setup-matrix
    strategy:
      matrix:
        os: ${{fromJson(needs.setup-matrix.outputs.matrix)}}
    runs-on: ${{ matrix.os.runner }}
    name: build-gpgui (${{ matrix.os.arch }})
    steps:
    - uses: pnpm/action-setup@v2
      with:
        version: 8
    - name: Prepare workspace
      run: rm -rf gpgui-source && mkdir gpgui-source
    - name: Checkout GlobalProtect-openconnect
      uses: actions/checkout@v3
      with:
        token: ${{ secrets.GH_PAT }}
        repository: yuezk/GlobalProtect-openconnect
        ref: ${{ github.ref }}
        path: gpgui-source/gp
    - name: Checkout gpgui@${{ github.ref_name }}
      uses: actions/checkout@v3
      with:
        token: ${{ secrets.GH_PAT }}
        repository: yuezk/gpgui
        ref: ${{ github.ref_name }}
        path: gpgui-source/gpgui
    - name: Tarball
      run: |
        cd gpgui-source
        tar -czf gpgui.tar.gz gpgui gp
    - name: Docker Login
      run: echo ${{ secrets.DOCKER_HUB_TOKEN }} | docker login -u ${{ secrets.DOCKER_HUB_USERNAME }} --password-stdin
    - name: Build gpgui in Docker
      run: |
        docker run --rm -v $(pwd)/gpgui-source:/gpgui yuezk/gpdev:gpgui-builder
    - name: Install gpgui in Docker
      run: |
        cd gpgui-source
        tar -xJf *.bin.tar.xz
        docker run --rm -v $(pwd):/gpgui yuezk/gpdev:gpgui-builder \
          bash -c "cd /gpgui/gpgui_*/ && ./gpgui --version"
    - name: Upload gpgui
      uses: actions/upload-artifact@v3
      with:
        name: artifact-gpgui-${{ matrix.os.arch }}
        if-no-files-found: error
        path: |
          gpgui-source/*.bin.tar.xz
          gpgui-source/*.bin.tar.xz.sha256

  gh-release:
    if: ${{ github.ref == 'refs/heads/dev' || startsWith(github.ref, 'refs/tags/') }}
    runs-on: ubuntu-latest
    needs:
      - tarball
      - build-gp
      - build-gpgui

    steps:
    - name: Prepare workspace
      run: rm -rf gh-release && mkdir gh-release
    - name: Download all artifacts
      uses: actions/download-artifact@v3
      with:
        path: gh-release
    - name: Create GH release
      env:
        GH_TOKEN: ${{ secrets.GH_PAT }}
        RELEASE_TAG: ${{ github.ref == 'refs/heads/dev' && 'snapshot' || github.ref_name }}
        REPO: ${{ github.repository }}
        NOTES: ${{ github.ref == 'refs/heads/dev' && '**!!! DO NOT USE THIS RELEASE IN PRODUCTION !!!**' || format('Release {0}', github.ref_name) }}
      run: |
        gh -R "$REPO" release delete $RELEASE_TAG --yes --cleanup-tag || true
        gh -R "$REPO" release create $RELEASE_TAG \
          --title "$RELEASE_TAG" \
          --notes "$NOTES" \
          ${{ github.ref == 'refs/heads/dev' && '--target dev' || '' }} \
          ${{ github.ref == 'refs/heads/dev' && '--prerelease' || '' }} \
          gh-release/artifact-source/* \
          gh-release/artifact-gpgui-*/*
