name: PlatformIO CI

on: [push, pull_request]

jobs:

  get_default_envs:
    name: Gather Environments
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: Cache pip
      uses: actions/cache@v3
      with:
        path: ~/.cache/pip
        key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
        restore-keys: |
          ${{ runner.os }}-pip-
    - uses: actions/setup-python@v4
      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: Build Enviornments
    runs-on: ubuntu-latest
    needs: get_default_envs
    strategy:
      fail-fast: false
      matrix:
        environment: ${{ fromJSON(needs.get_default_envs.outputs.environments) }}
    steps:
    - uses: actions/checkout@v3
    - name: Cache pip
      uses: actions/cache@v3
      with:
        path: ~/.cache/pip
        key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
        restore-keys: |
          ${{ runner.os }}-pip-
    - name: Cache PlatformIO
      uses: actions/cache@v3
      with:
        path: ~/.platformio
        key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }}
    - name: Set up Python
      uses: actions/setup-python@v4
      with:
          python-version: '3.9'
    - name: Install PlatformIO
      run: pip install -r requirements.txt
    - name: Build firmware
      env:
        WLED_RELEASE: True
      run: pio run -e ${{ matrix.environment }}
    - uses: actions/upload-artifact@v2
      with:
        name: firmware-${{ matrix.environment }}
        path: |
          build_output/firmware/*.bin
          build_output/firmware/*.gz
    - uses: actions/upload-artifact@v2
      if: startsWith(github.ref, 'refs/tags/')
      with:
        name: firmware-release
        path: build_output/release/*.bin
  release:
    name: Create Release
    runs-on: ubuntu-latest
    needs: [get_default_envs, build]
    if: startsWith(github.ref, 'refs/tags/')
    steps:
    - uses: actions/download-artifact@v2
      with:
        name: firmware-release
    - name: Create draft release
      uses: softprops/action-gh-release@v1
      with:
        draft: True
        files: |
          *.bin
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}