name: PathPlannerLib

on:
  push:
    branches: [main]

  pull_request:

  workflow_dispatch:

env:
  VERSION_NAME: 0.0.0-dev-${{ github.run_number }}

jobs:
  formatting:
    name: "[PPLib] Check Formatting"
    runs-on: ubuntu-22.04
    container: wpilib/ubuntu-base:22.04

    steps:
      - name: Checkout repo
        uses: actions/checkout@v4
      
      - name: Grant execute permission for gradlew
        run: chmod +x gradlew
        working-directory: ./pathplannerlib
      
      - name: Check formatting
        run: ./gradlew spotlessCheck
        working-directory: ./pathplannerlib
  
  test:
    name: "[PPLib] Unit Tests"
    runs-on: ubuntu-22.04
    container: wpilib/ubuntu-base:22.04

    steps:
      - name: Checkout repo
        uses: actions/checkout@v4
      
      - name: Grant execute permission for gradlew
        run: chmod +x gradlew
        working-directory: ./pathplannerlib
      
      - name: Build & Test
        run: ./gradlew build
        working-directory: ./pathplannerlib
      
      # - name: Upload coverage reports to Codecov
      #   uses: codecov/codecov-action@v3
      #   with:
      #     token: ${{ secrets.CODECOV_TOKEN }}
      #     name: pplib-coverage
      #     files: pathplannerlib/build/reports/jacoco/test/jacocoTestReport.xml
  
  test-python:
    name: "[PPLib Python] Unit Tests"
    runs-on: ubuntu-22.04

    steps:
      - name: Checkout repo
        uses: actions/checkout@v4
      
      - name: Set up Python 3.12
        uses: actions/setup-python@v5
        with:
          python-version: "3.12"
      
      - name: Install dependencies
        working-directory: ./pathplannerlib-python
        run: |
          python -m pip install --upgrade pip
          pip install pytest
          if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
      
      - name: Test with pytest
        working-directory: ./pathplannerlib-python
        run: pytest
  
  build-python:
    name: "[PPLib Python] Build"
    runs-on: ubuntu-22.04
    needs: [test-python]

    steps:
      - name: Checkout repo
        uses: actions/checkout@v4
      
      - name: Set up Python 3.12
        uses: actions/setup-python@v5
        with:
          python-version: "3.12"
      
      - name: Install dependencies
        working-directory: ./pathplannerlib-python
        run: |
          python -m pip install --upgrade pip
          pip install build
          if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
      
      - name: Set version
        run: sed -i "s/0.0.0/${{ env.VERSION_NAME }}/g" pyproject.toml
        working-directory: ./pathplannerlib-python
      
      - name: Build
        working-directory: ./pathplannerlib-python
        run: python -m build
      
      - name: Upload artifact
        uses: actions/upload-artifact@v4
        with:
          name: robotpy-pathplannerlib
          path: pathplannerlib-python/dist
  
  build-docker:
    strategy:
      fail-fast: false
      matrix:
        include:
          - container: wpilib/roborio-cross-ubuntu:2025-22.04
            artifact-name: PPLib-Athena
            build-options: "-Ponlylinuxathena"
          - container: wpilib/ubuntu-base:22.04
            artifact-name: PPLib-Linux
            build-options: "-Ponlylinuxx86-64"
          - container: wpilib/raspbian-cross-ubuntu:bookworm-22.04
            artifact-name: PPLib-Arm32
            build-options: "-Ponlylinuxarm32"
          - container: wpilib/aarch64-cross-ubuntu:bookworm-22.04
            artifact-name: PPLib-Arm64
            build-options: "-Ponlylinuxarm64"
    name: "[PPLib] Build - ${{ matrix.artifact-name }}"
    needs: [formatting, test]
    runs-on: ubuntu-22.04
    container: ${{ matrix.container }}
    steps:
      - name: Checkout repo
        uses: actions/checkout@v4
      
      - name: Grant execute permission for gradlew
        run: chmod +x gradlew
        working-directory: ./pathplannerlib
      
      - name: Set version
        run: sed -i "s/0.0.0/${{ env.VERSION_NAME }}/g" publish.gradle
        working-directory: ./pathplannerlib
      
      - name: Ensure spotless is applied
        run: ./gradlew spotlessApply
        working-directory: ./pathplannerlib
      
      - name: Build
        run: ./gradlew build ${{ matrix.build-options }}
        working-directory: ./pathplannerlib
      
      - name: Upload artifact
        uses: actions/upload-artifact@v4
        with:
          name: ${{ matrix.artifact-name }}
          path: pathplannerlib/build/allOutputs
  
  build-host:
    env:
      MACOSX_DEPLOYMENT_TARGET: 13.3
    strategy:
      fail-fast: false
      matrix:
        include:
          - os: windows-2022
            artifact-name: PPLib-Win64
            os-name: windows
          - os: macos-15
            artifact-name: PPLib-macOS
            os-name: macos
    name: "[PPLib] Build - ${{ matrix.artifact-name }}"
    needs: [formatting, test]
    runs-on: ${{ matrix.os }}
    steps:
      - name: Checkout repo
        uses: actions/checkout@v4
      
      - name: Setup java
        uses: actions/setup-java@v4
        with:
          java-version: '17'
          distribution: 'zulu'
      
      - name: Set version
        if: ${{ matrix.os-name != 'macos' }}
        run: sed -i "s/0.0.0/${{ env.VERSION_NAME }}/g" publish.gradle
        working-directory: ./pathplannerlib
      
      - name: Set version (mac)
        if: ${{ matrix.os-name == 'macos' }}
        run: sed -i '' "s/0.0.0/${{ env.VERSION_NAME }}/g" publish.gradle
        working-directory: ./pathplannerlib
      
      - name: Ensure spotless is applied
        run: ./gradlew spotlessApply
        working-directory: ./pathplannerlib
      
      - name: Build
        run: ./gradlew build -Pbuildalldesktop
        working-directory: ./pathplannerlib
      
      - name: Upload artifact
        uses: actions/upload-artifact@v4
        with:
          name: ${{ matrix.artifact-name }}
          path: pathplannerlib/build/allOutputs
  
  combine:
    name: "[PPLib] Combine"
    needs: [build-docker, build-host]
    runs-on: ubuntu-22.04
    steps:
      - name: Checkout build-tools
        uses: actions/checkout@v4
        with:
          repository: wpilibsuite/build-tools
      
      - name: Download artifacts
        uses: actions/download-artifact@v4
        with:
          path: combiner/products/build/allOutputs
      
      - name: Flatten Artifacts
        run: rsync -a --delete combiner/products/build/allOutputs/*/* combiner/products/build/allOutputs/
      
      - name: Setup java
        uses: actions/setup-java@v4
        with:
          java-version: '17'
          distribution: 'zulu'
      
      - name: Combine
        run: ./gradlew publish -Pthirdparty
        working-directory: combiner
      
      - name: Upload artifact
        uses: actions/upload-artifact@v4
        with:
          name: PPLib-Maven-v${{ env.VERSION_NAME }}
          path: ~/releases