name: PlatformIO CI

# Only included into other workflows
on:
  workflow_call:
    inputs:
      nightly_build:
        description: 'Flag to indicate this is a nightly build'
        required: false
        type: boolean
        default: false

jobs:

  get_default_envs:
    name: Gather Environments
    runs-on: ubuntu-22.04
    steps:
    - uses: actions/checkout@v4
    - name: Cache pip
      uses: actions/cache@v4
      with:
        path: ~/.cache/pip
        key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
        restore-keys: |
          ${{ runner.os }}-pip-
    - uses: actions/setup-python@v5
      with:
        python-version: '3.9'
    - name: Install PlatformIO
      run: pip install -r requirements.txt
    - name: Get default environments
      id: envs
      run: |
        echo "environments=$(pio project config --json-output | jq -cr '.[0][1][0][1]')" >> $GITHUB_OUTPUT
    outputs:
      environments: ${{ steps.envs.outputs.environments }}


  build:
    name: Builds
    runs-on: ubuntu-22.04
    needs: get_default_envs
    strategy:
      fail-fast: false
      matrix:
        environment: ${{ fromJSON(needs.get_default_envs.outputs.environments) }}
    steps:
    - uses: actions/checkout@v4
    - name: Cache pip
      uses: actions/cache@v4
      with:
        path: ~/.cache/pip
        key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
        restore-keys: |
          ${{ runner.os }}-pip-
    - name: Cache PlatformIO
      uses: actions/cache@v4
      with:
        path: ~/.platformio
        key: ${{ runner.os }}-${{ matrix.environment}}
    - name: Set up Python
      uses: actions/setup-python@v5
      with:
          python-version: '3.9'
    - name: Install PlatformIO
      run: pip install -r requirements.txt
    - name: Build firmware
      env:
        WLED_RELEASE: True
        WLED_NIGHTLY_BUILD: ${{ inputs.nightly_build && 'true' || 'false' }}
      run: pio run -e ${{ matrix.environment }}
    - name: Rename Bin
      run: mv -v .pio/build/${{ matrix.environment }}/firmware.bin firmware-${{ matrix.environment }}.bin
    - uses: actions/upload-artifact@v4
      with:
        name: firmware-${{ matrix.environment }}
        path: firmware-${{ matrix.environment }}.bin
    - uses: actions/upload-artifact@v4
      if: startsWith(github.ref, 'refs/tags/')
      with:
        name: firmware-release-${{ matrix.environment }}
        path: build_output/release/*.bin
  
