# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/check-taskfiles.md
name: Check Taskfiles

env:
  # See: https://github.com/actions/setup-node/#readme
  NODE_VERSION: 16.x

# See: https://docs.github.com/actions/using-workflows/events-that-trigger-workflows
on:
  create:
  push:
    paths:
      - ".github/workflows/check-taskfiles.ya?ml"
      - "package.json"
      - "package-lock.json"
      - "**/Taskfile.ya?ml"
  pull_request:
    paths:
      - ".github/workflows/check-taskfiles.ya?ml"
      - "package.json"
      - "package-lock.json"
      - "**/Taskfile.ya?ml"
  schedule:
    # Run every Tuesday at 8 AM UTC to catch breakage resulting from changes to the JSON schema.
    - cron: "0 8 * * TUE"
  workflow_dispatch:
  repository_dispatch:

jobs:
  run-determination:
    runs-on: ubuntu-latest
    permissions: {}
    outputs:
      result: ${{ steps.determination.outputs.result }}
    steps:
      - name: Determine if the rest of the workflow should run
        id: determination
        run: |
          RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x"
          # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead.
          if [[
            "${{ github.event_name }}" != "create" ||
            "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX
          ]]; then
            # Run the other jobs.
            RESULT="true"
          else
            # There is no need to run the other jobs.
            RESULT="false"
          fi

          echo "result=$RESULT" >> $GITHUB_OUTPUT

  validate:
    name: Validate ${{ matrix.file }}
    needs: run-determination
    if: needs.run-determination.outputs.result == 'true'
    runs-on: ubuntu-latest
    permissions:
      contents: read

    strategy:
      fail-fast: false

      matrix:
        file:
          - ./**/Taskfile.yml

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

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: ${{ env.NODE_VERSION }}

      - name: Download JSON schema for Taskfiles
        id: download-schema
        uses: carlosperate/download-file-action@v2
        with:
          # Source: https://github.com/SchemaStore/schemastore/blob/master/src/schemas/json/taskfile.json
          file-url: https://taskfile.dev/schema.json
          location: ${{ runner.temp }}/taskfile-schema

      - name: Install JSON schema validator
        run: npm install

      - name: Validate ${{ matrix.file }}
        run: |
          # See: https://github.com/ajv-validator/ajv-cli#readme
          npx \
            --package=ajv-cli \
            --package=ajv-formats \
            ajv validate \
              --all-errors \
              --strict=false \
              -c ajv-formats \
              -s "${{ steps.download-schema.outputs.file-path }}" \
              -d "${{ matrix.file }}"
