name: Build
on: [push, pull_request]

jobs:
  build:
    name: ${{ matrix.template }} ${{ matrix.environment.name }}
    runs-on: ubuntu-latest

    strategy:
      fail-fast: false
      matrix:
        template: [basic, basic-osc, ble-advertising, libmapper-osc]
        environment:
          - name: Xiao
            board: seeed_xiao_esp32c3
            extra_flags: ""
          - name: tinypico
            board: tinypico
            extra_flags: "-DBOARD_HAS_PSRAM -mfix-esp32-psram-cache-issue"
          - name: m5stick-c
            board: m5stick-c
            extra_flags: "-DBOARD_HAS_PSRAM -mfix-esp32-psram-cache-issue"
          - name: ESP32-S3
            board: esp32-c3-devkitc-02
            extra_flags: "-DBOARD_HAS_PSRAM"

    steps:
      - uses: actions/checkout@v4

      - uses: actions/cache@v4
        with:
          path: |
            ~/.cache/pip
            ~/.platformio/.cache
          key: ${{ runner.os }}-pio

      - uses: actions/setup-python@v5
        with:
          python-version: '3.11'

      - name: Install PlatformIO Core
        run: pip install --upgrade platformio

      - name: Create Temporary platformio.ini
        run: |
          echo "[platformio]" > ./${{ matrix.template }}/platformioTemp.ini
          echo "[env:${{ matrix.environment.name }}]" >> ./${{ matrix.template }}/platformioTemp.ini
          echo "platform = espressif32" >> ./${{ matrix.template }}/platformioTemp.ini
          echo "board = ${{ matrix.environment.board }}" >> ./${{ matrix.template }}/platformioTemp.ini
          echo "framework = arduino" >> ./${{ matrix.template }}/platformioTemp.ini
          echo "board_build.partitions = min_spiffs_no_OTA.csv" >> ./${{ matrix.template }}/platformioTemp.ini
          echo "lib_deps =" >> ./${{ matrix.template }}/platformioTemp.ini
          echo "    https://github.com/Puara/puara-module.git" >> ./${{ matrix.template }}/platformioTemp.ini
          echo "    https://github.com/cnmat/OSC#3.5.8" >> ./${{ matrix.template }}/platformioTemp.ini
          echo "monitor_speed = 115200" >> ./${{ matrix.template }}/platformioTemp.ini
          echo "monitor_echo = yes" >> ./${{ matrix.template }}/platformioTemp.ini
          echo "monitor_filters = default,esp32_exception_decoder" >> ./${{ matrix.template }}/platformioTemp.ini
          echo "build_flags = -std=gnu++2a ${{ matrix.environment.extra_flags }}" >> ./${{ matrix.template }}/platformioTemp.ini
          echo "build_unflags = -std=gnu++11 -std=gnu++14 -std=gnu++17" >> ./${{ matrix.template }}/platformioTemp.ini

      - name: Verify File Creation
        run: |
          ls -al
          ls -al ./basic  # List files to ensure platformioTemp.ini exists

      - name: Build
        run: |
          cd ./${{ matrix.template }}
          pio settings set force_verbose 1
          pio run --environment ${{ matrix.environment.name }} --project-conf platformioTemp.ini

      - name: Simulate and test with Wokwi
        if: ${{ matrix.environment.name == 'ESP32-S3' }}
        uses: wokwi/wokwi-ci-action@v1
        with:
          token: ${{ secrets.WOKWI_CLI_TOKEN }}
          path: ./${{ matrix.template }}/  # directory with wokwi.toml, relative to repo's root
          timeout: 30000
          expect_text: 'Puara Start Done!'