name: PyTaiko
on:
  push:
    branches: ["main"]
  pull_request:
    branches: ["main"]
permissions:
  contents: write
  pull-requests: write
  issues: write
  repository-projects: write
jobs:
  build:
    strategy:
      matrix:
        os: [ubuntu-22.04, windows-latest, macos-latest]
    runs-on: ${{ matrix.os }}
    steps:
      - name: Check-out repository
        uses: actions/checkout@v4

      - name: Install libaudio Dependencies (macOS)
        if: runner.os == 'macOS'
        run: |
          brew update
          brew install portaudio libsndfile speexdsp ccache

      - name: Install libaudio Dependencies (Windows)
        if: runner.os == 'Windows'
        uses: msys2/setup-msys2@v2
        with:
          update: true
          install: >-
            base-devel
            mingw-w64-x86_64-gcc
            mingw-w64-x86_64-libsndfile
            mingw-w64-x86_64-speexdsp
            mingw-w64-x86_64-ccache

      - name: Install libaudio Dependencies (Linux)
        if: runner.os == 'Linux'
        run: |
          sudo apt-get update
          sudo apt-get install -y \
              build-essential \
              pkg-config \
              libsndfile1-dev \
              libspeexdsp-dev \
              portaudio19-dev \
              libpulse-dev \
              ccache \

      - name: Build libaudio (Windows)
        if: runner.os == 'Windows'
        shell: msys2 {0}
        run: |
          cd libs/audio
          make clean
          make all
          make verify

      - name: Build libaudio (Unix)
        if: runner.os != 'Windows'
        shell: bash
        run: |
          cd libs/audio
          make clean
          make all
          make verify

      - name: Upload libaudio Artifacts
        uses: actions/upload-artifact@v4
        with:
          name: libaudio-${{ runner.os }}-${{ runner.arch }}
          path: |
            libs/audio/libaudio.dll
            libs/audio/libaudio.so
            libs/audio/libaudio.dylib
            libs/audio/*.a
          if-no-files-found: ignore

      - name: Install uv
        uses: astral-sh/setup-uv@v4

      - name: Setup Python
        run: uv python install

      - name: Build Executable
        shell: bash
        run: |
          uv run nuitka \
          --lto=yes \
          --mode=app \
          --noinclude-setuptools-mode=nofollow \
          --noinclude-IPython-mode=nofollow \
          --assume-yes-for-downloads \
          --windows-icon-from-ico=libs/icon.ico \
          --macos-app-icon=libs/icon.icns \
          --linux-icon=libs/icon.png \
          PyTaiko.py

      - name: Create Release Directory
        run: |
          mkdir -p release
          cp -r Graphics Sounds Videos Songs config.toml shader model release/

          if [ "${{ runner.os }}" == "Windows" ]; then
            cp libs/audio/*.dll release/ 2>/dev/null || echo "libaudio not found"
          elif [ "${{ runner.os }}" == "macOS" ]; then
            cp libs/audio/libaudio.dylib release/ 2>/dev/null || echo "libaudio not found"
          else
            cp libs/audio/libaudio.so release/ 2>/dev/null || echo "libaudio not found"
          fi

          if [ "${{ runner.os }}" == "Windows" ]; then
            cp *.exe release/ 2>/dev/null || echo "No .exe files found"
          elif [ "${{ runner.os }}" == "macOS" ]; then
            cp -r *.app release/ 2>/dev/null || echo "No .app bundles found"
          else
            cp *.bin release/ 2>/dev/null || echo "No .bin files found"
          fi
        shell: bash

      - name: Create Zip Archive
        run: |
          cd release
          if [ "${{ runner.os }}" == "Windows" ]; then
            7z a ../PyTaiko-${{ runner.os }}-${{ runner.arch }}.zip *
          else
            zip -r ../PyTaiko-${{ runner.os }}-${{ runner.arch }}.zip *
          fi
        shell: bash

      - name: Upload Release
        uses: softprops/action-gh-release@v2
        if: github.ref == 'refs/heads/main' && github.event_name == 'push'
        with:
          files: PyTaiko-${{ runner.os }}-${{ runner.arch }}.zip
          name: "PyTaiko [Rolling Release]"
          tag_name: "latest"
          make_latest: true
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
