# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json

name: Continuous Integration

on:
  workflow_dispatch:
  push:
  pull_request:

concurrency:
  group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
  cancel-in-progress: true

jobs:
  arduino:
    name: arduino ${{ matrix.name }}
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        include:
          - name: package_esp32_index.json
            core: esp32:esp32
            board: esp32:esp32:esp32
            index_url: https://espressif.github.io/arduino-esp32/package_esp32_index.json
          - name: package_esp32_dev_index.json
            core: esp32:esp32
            board: esp32:esp32:esp32
            index_url: https://espressif.github.io/arduino-esp32/package_esp32_dev_index.json
          - name: package_esp8266com_index.json
            core: esp8266:esp8266
            board: esp8266:esp8266:huzzah
            index_url: https://arduino.esp8266.com/stable/package_esp8266com_index.json

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Arduino Lint
        uses: arduino/arduino-lint-action@v1
        with:
          library-manager: update

      - name: Install arduino-cli
        run: curl -fsSL https://raw.githubusercontent.com/arduino/arduino-cli/master/install.sh | BINDIR=/usr/local/bin sh

      - name: Update core index
        run: arduino-cli core update-index --additional-urls "${{ matrix.index_url }}"

      - name: Install core
        run: arduino-cli core install --additional-urls "${{ matrix.index_url }}" ${{ matrix.core }}

      - name: Install Async TCP
        run: ARDUINO_LIBRARY_ENABLE_UNSAFE_INSTALL=true arduino-cli lib install --git-url https://github.com/mathieucarbou/AsyncTCP#v3.1.4

      - name: Install ESPAsyncTCP
        run: ARDUINO_LIBRARY_ENABLE_UNSAFE_INSTALL=true arduino-cli lib install --git-url https://github.com/mathieucarbou/esphome-ESPAsyncTCP#v2.0.0

      - name: Install ESP Async WebServer
        run: ARDUINO_LIBRARY_ENABLE_UNSAFE_INSTALL=true arduino-cli lib install --git-url https://github.com/mathieucarbou/ESPAsyncWebServer#v3.0.6

      - name: Build Demo
        run: arduino-cli compile --library . --warnings none -b ${{ matrix.board }} "examples/Demo/Demo.ino"

      - name: Build Demo_AP
        run: arduino-cli compile --library . --warnings none -b ${{ matrix.board }} "examples/Demo_AP/Demo_AP.ino"

      - name: Build Logging
        run: arduino-cli compile --library . --warnings none -b ${{ matrix.board }} "examples/Logging/Logging.ino"

      - name: Build HighPerf
        run: arduino-cli compile --library . --warnings none -b ${{ matrix.board }} "examples/HighPerf/HighPerf.ino"

  platformio:
    name: pio ${{ matrix.name }}
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        include:
          - name: esp32dev|arduino
            board: esp32dev
            platform: espressif32
            opts: "--project-option 'lib_compat_mode = strict'"
          - name: esp32dev|arduino-2
            board: esp32dev
            platform: espressif32@6.7.0
            opts: "--project-option 'lib_compat_mode = strict'"
          - name: esp32dev|arduino-3
            board: esp32dev
            platform: espressif32
            opts: "--project-option 'lib_compat_mode = strict' --project-option 'platform_packages=platformio/framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#3.0.2, platform_packages=platformio/framework-arduinoespressif32-libs @ https://github.com/espressif/arduino-esp32/releases/download/3.0.2/esp32-arduino-libs-3.0.2.zip'"

          - name: esp32-s3-devkitc-1|arduino
            board: esp32-s3-devkitc-1
            platform: espressif32
            opts: "--project-option 'lib_compat_mode = strict'"
          - name: esp32-s3-devkitc-1|arduino-2
            board: esp32-s3-devkitc-1
            platform: espressif32@6.7.0
            opts: "--project-option 'lib_compat_mode = strict'"
          - name: esp32-s3-devkitc-1|arduino-3
            board: esp32-s3-devkitc-1
            platform: espressif32
            opts: "--project-option 'lib_compat_mode = strict' --project-option 'platform_packages=platformio/framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#3.0.2, platform_packages=platformio/framework-arduinoespressif32-libs @ https://github.com/espressif/arduino-esp32/releases/download/3.0.2/esp32-arduino-libs-3.0.2.zip'"

          - name: huzzah|espressif8266
            board: huzzah
            platform: espressif8266
            opts: "--project-option 'lib_compat_mode = strict'"
    steps:
      - uses: actions/checkout@v4
      - name: Set up cache
        uses: actions/cache@v4
        with:
          path: |
            ~/.platformio
            ~/.cache/pip
          key: ${{ matrix.name }}
      - uses: actions/setup-python@v5
        with:
          python-version: "3.x"
      - run: pip install platformio
      - run: platformio platform install ${{ matrix.platform }}

      - run: platformio ci "examples/Demo/Demo.ino" -l '.' -b ${{ matrix.board }} ${{ matrix.opts }}
      - run: platformio ci "examples/Demo_AP/Demo_AP.ino" -l '.' -b ${{ matrix.board }} ${{ matrix.opts }}
      - run: platformio ci "examples/Logging/Logging.ino" -l '.' -b ${{ matrix.board }} ${{ matrix.opts }}
      - run: platformio ci "examples/HighPerf/HighPerf.ino" -l '.' -b ${{ matrix.board }} ${{ matrix.opts }}
