name: Main

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

env:
  CACHE: true

jobs:
  changes:
    name: Detect changes
    runs-on: ubuntu-latest
    outputs:
      any: ${{ steps.changes.outputs.any }}
      programs: ${{ steps.changes.outputs.programs }}
      program_matrix: ${{ steps.program_matrix.outputs.matrix }}
    steps:
      - name: Git checkout
        uses: actions/checkout@v3

      - name: Load environment variables
        run: cat .github/.env >> $GITHUB_ENV

      - name: Detect changes
        uses: dorny/paths-filter@v2
        id: changes
        with:
          filters: .github/file-filters.yml

      - name: Filter program matrix
        id: program_matrix
        uses: metaplex-foundation/actions/filter-matrix@v1
        with:
          matrix: ${{ env.PROGRAMS }}
          changes: ${{ steps.changes.outputs.changes }}
          suffix: _program

  build_programs:
    name: Programs
    if: ${{ needs.changes.outputs.any == 'true' }}
    needs: changes
    uses: ./.github/workflows/build-programs.yml
    secrets: inherit

  test_programs:
    name: Programs
    if: ${{ needs.changes.outputs.programs == 'true' }}
    needs: changes
    uses: ./.github/workflows/test-programs.yml
    secrets: inherit
    with:
      program_matrix: ${{ needs.changes.outputs.program_matrix }}

  generate_clients:
    name: Generate clients
    if: ${{ needs.changes.outputs.any == 'true' }}
    needs: build_programs
    runs-on: ubuntu-latest-8-cores
    outputs:
      js_changed: ${{ steps.changes.outputs.js_client }}
    permissions:
      contents: write
      pull-requests: write
    steps:
      - name: Git checkout
        uses: actions/checkout@v3

      - name: Load environment variables
        run: cat .github/.env >> $GITHUB_ENV

      - name: Install Linux Build Deps
        run: sudo apt-get update && sudo apt-get install -y pkg-config build-essential libudev-dev

      - name: Install Rust
        uses: metaplex-foundation/actions/install-rust@v1
        with:
          toolchain: ${{ env.RUST_VERSION }}

      - name: Install Solana
        uses: metaplex-foundation/actions/install-solana@v1
        with:
          version: ${{ env.SOLANA_VERSION }}
          cache: ${{ env.CACHE }}

      - name: Cache program dependencies
        if: env.CACHE == 'true'
        uses: metaplex-foundation/actions/cache-programs@v1

      - name: Install Node.js
        uses: metaplex-foundation/actions/install-node-with-pnpm@v1
        with:
          version: ${{ env.NODE_VERSION }}
          cache: ${{ env.CACHE }}
          dependencies: true

      - name: Cache IDL generators
        if: env.CACHE == 'true'
        uses: metaplex-foundation/actions/cache-idl-generators@v1

      - name: Generate IDLs and clients
        run: pnpm generate

      - name: Commit generated clients
        uses: stefanzweifel/git-auto-commit-action@v4
        with:
          commit_message: Update generated clients

      - name: Detect client changes
        uses: dorny/paths-filter@v2
        id: changes
        with:
          filters: .github/file-filters.yml

  test_js:
    if: needs.generate_clients.outputs.js_changed == 'true'
    name: JS Client
    needs: generate_clients
    uses: ./.github/workflows/test-js.yml
    secrets: inherit