name: OpenDTU Build

on:
  push:
    paths-ignore:
      - docs/**
      - '**/*.md'
  pull_request:
    paths-ignore:
      - docs/**
      - '**/*.md'

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.x"

      - name: Install PlatformIO
        run: |
          python -m pip install --upgrade pip
          pip install --upgrade platformio

      - 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:
      matrix:
        environment: ${{ fromJSON(needs.get_default_envs.outputs.environments) }}
    steps:
      - uses: actions/checkout@v3

      - name: Get tags
        run: git fetch --force --tags origin

      - 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.x"

      - name: Install PlatformIO
        run: |
          python -m pip install --upgrade pip
          pip install --upgrade platformio

      - name: Setup Node.js and yarn
        uses: actions/setup-node@v3
        with:
          node-version: "18"
          cache: "yarn"
          cache-dependency-path: "webapp/yarn.lock"

      - name: Install WebApp dependencies
        run: yarn --cwd webapp install --frozen-lockfile

      - name: Build WebApp
        run: yarn --cwd webapp build

      - name: Build firmware
        run: pio run -e ${{ matrix.environment }}

      - name: Rename Firmware
        run: mv .pio/build/${{ matrix.environment }}/firmware.bin .pio/build/${{ matrix.environment }}/opendtu-${{ matrix.environment }}.bin

      - name: Copy boot_app0.bin
        run: cp ~/.platformio/packages/framework-arduinoespressif32/tools/partitions/boot_app0.bin .pio/build/${{ matrix.environment }}/boot_app0.bin

      - uses: actions/upload-artifact@v3
        with:
          name: opendtu-${{ matrix.environment }}
          path: |
            .pio/build/${{ matrix.environment }}/opendtu-${{ matrix.environment }}.bin
            .pio/build/${{ matrix.environment }}/partitions.bin
            .pio/build/${{ matrix.environment }}/bootloader.bin
            .pio/build/${{ matrix.environment }}/boot_app0.bin

  release:
    name: Create Release
    runs-on: ubuntu-latest
    needs: [get_default_envs, build]
    if: startsWith(github.ref, 'refs/tags/')
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Build Changelog
        id: github_release
        uses: mikepenz/release-changelog-builder-action@v3.7.0
        with:
          failOnError: true
          commitMode: true
          configuration: ".github/workflows/config/release-notes-config.json"
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - uses: actions/download-artifact@v3
        with:
          path: artifacts/

      - name: Create ZIPs
        run: |
          ls -R
          sudo apt install zip
          cd artifacts
          for i in */; do zip -r "${i%/}.zip" "$i"; done
          for i in */; do cp ${i}opendtu-*.bin ./; done

      - name: Create release
        uses: softprops/action-gh-release@v1
        with:
          body: ${{steps.github_release.outputs.changelog}}
          draft: False
          files: |
            artifacts/*.zip, artifacts/*.bin
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
