name: Build
on:
  push:
    paths-ignore:
      - LICENSE
      - "*.md"
      - .vscode
      - .devcontainer
    branches:
      - main
      - dev
    tags:
      - latest
      - 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=[\"ubuntu-latest\", \"arm64\"]" >> $GITHUB_OUTPUT
          else
            echo "matrix=[\"ubuntu-latest\"]" >> $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
        path: source/gp
    - name: Create tarball
      run: |
        cd source/gp
        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)}}
    runs-on: ${{ matrix.os }}
    steps:
    - name: Prepare workspace
      run: rm -rf build-gp && mkdir build-gp
    - name: Download tarball
      uses: actions/download-artifact@v3
      with:
        name: artifact-source
        path: build-gp
    - name: Docker Login
      run: echo ${{ secrets.DOCKER_HUB_TOKEN }} | docker login -u ${{ secrets.DOCKER_HUB_USERNAME }} --password-stdin
    - name: Build gp in Docker
      run: |
        docker run --rm -v $(pwd)/build-gp:/gp yuezk/gpdev:gp-builder

  build-gpgui:
    needs:
    - setup-matrix
    strategy:
      matrix:
        os: ${{fromJson(needs.setup-matrix.outputs.matrix)}}
    runs-on: ${{ matrix.os }}
    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
        path: gpgui-source/gp
    - name: Checkout gpgui
      uses: actions/checkout@v3
      with:
        token: ${{ secrets.GH_PAT }}
        repository: yuezk/gpgui
        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 }}
        if-no-files-found: error
        path: |
          gpgui-source/*.bin.tar.xz
          gpgui-source/*.bin.tar.xz.sha256

  gh-release:
    if: startsWith(github.ref, 'refs/tags/')
    runs-on: ubuntu-latest
    needs:
      - 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
      uses: softprops/action-gh-release@v1
      with:
        token: ${{ secrets.GH_PAT }}
        prerelease: ${{ contains(github.ref, 'latest') }}
        fail_on_unmatched_files: true
        files: |
          gh-release/artifact-*/*
