name: Build and Release

on: push

jobs:
  build:
    name: Build on ${{ matrix.os }}
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-latest, windows-latest, macos-latest]

    steps:
      - name: Check-out repository
        uses: actions/checkout@v4

      - name: Setup Python
        uses: actions/setup-python@v5
        with:
          python-version: "3.11"
          architecture: "x64"
          cache: "pip"
          cache-dependency-path: |
            **/requirements*.txt

      - name: Install Dependencies
        run: pip install -r requirements.txt

      - name: Build Executable
        uses: Nuitka/Nuitka-Action@main
        with:
          nuitka-version: main
          script-name: run.py
          nofollow-import-to: "*tk*,_codecs,encodings,multiprocessing,gi"
          disable-plugins: tk-inter,dill-compat,eventlet,gevent,pyqt5,pyqt6,pyside2,pyside6,delvewheel,pywebview,matplotlib,spacy,enum-compat,pbr-compat,gevent,pmw-freezer,transformers,upx,kivy,options-nanny,multiprocessing,gi
          include-data-dir: assets=assets
          include-data-files: CREDITS=CREDITS
          mode: standalone
          output-file: NotifPlayground

      - name: Zip Build Output
        shell: bash
        run: |
          mkdir -p zip_output
          if [ "${{ runner.os }}" = "Windows" ]; then
            powershell.exe -Command "Compress-Archive -Path 'build/run.dist/*' -DestinationPath 'zip_output/NotifPlayground-${{ runner.os }}.zip'"
          else
            cd build/run.dist
            zip -r "../../zip_output/NotifPlayground-${{ runner.os }}.zip" .
          fi

      - name: Upload Zipped Build Artifact
        uses: actions/upload-artifact@v4
        with:
          name: NotifPlayground-${{ runner.os }}.zip
          path: zip_output/NotifPlayground-${{ runner.os }}.zip
  release:
    name: Create GitHub Release
    needs: build
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Download All Zipped Builds
        uses: actions/download-artifact@v4
        with:
          path: downloads

      - name: Delete Old Release (if exists)
        continue-on-error: true
        run: gh release delete latest -y
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Delete Git tag (if exists)
        continue-on-error: true
        run: |
          git push origin :refs/tags/latest
          git tag -d latest

      - name: Recreate Git tag at HEAD
        run: |
          git tag latest
          git push origin latest

      - name: Create the new release
        run: gh release create latest downloads/**/NotifPlayground-*.zip --title "Latest Build" --notes "Most recent multi-platform builds of NotifPlayground"
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
