name: Native

on:
  schedule:
    - cron: "0 0 * * *"
  push:
    branches:
      - main
  pull_request:
    types: [opened, synchronize, reopened]
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [20.x]
        solana-version: [stable, beta]
    steps:
      - uses: actions/checkout@v4
      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node-version }}
          check-latest: true
      - uses: heyAyushh/setup-solana@v5.2
        with:
          solana-cli-version: ${{ matrix.solana-version }}
      - run: solana block
        shell: bash
      - name: Install pnpm
        run: |
          npm install --global pnpm
      - name: Build Native programs
        run: |
          declare -a ProjectDirs=($(find . -type d -name "native"| grep -v -f <(grep . .github/.ghaignore | grep -v '^$')))
          echo "Projects to Build:"
          printf "%s\n" "${ProjectDirs[@]}"
          for projectDir in "${ProjectDirs[@]}"; do
            echo "
            ********
            Building $projectDir
            ********"
            cd $projectDir
            if pnpm build; then
              echo "Build succeeded for $projectDir."
            else
              failed=true
              failed_builds+=($projectDir)
              echo "Build failed for $projectDir. Continuing with the next program."
            fi
          cd - > /dev/null
          done
          if [ "$failed" = true ]; then
            echo "Programs that failed building:"
            printf "%s\n" "${failed_builds[@]}"
            exit 1
          else
            echo "All programs built successfully."
          fi
        shell: bash

  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [20.x]
        solana-version: [1.17.25, stable, beta]
    steps:
      - uses: actions/checkout@v4
      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node-version }}
          check-latest: true
      - uses: heyAyushh/setup-solana@v5.2
        with:
          solana-cli-version: ${{ matrix.solana-version }}
      - run: solana block
        shell: bash
      - name: Install pnpm
        run: |
          npm install --global pnpm
      - name: Test solana native programs
        run: |
          solana -V
          rustc -V
          declare -a ProjectDirs=($(find . -type d -name "native"| grep -v -f <(grep . .github/.ghaignore | grep -v '^$')))
          echo "Projects to Test:"
          printf "%s\n" "${ProjectDirs[@]}"
          for projectDir in "${ProjectDirs[@]}"; do
            echo "
            ********
            Testing $projectDir
            ********"
            cd $projectDir
            pnpm install --frozen-lockfile
            if pnpm build-and-test; then
              echo "Tests succeeded for $projectDir."
            else
              failed=true
              failed_tests+=($projectDir)
              echo "Tests failed for $projectDir. Continuing with the next program."
            fi
          cd - > /dev/null
          done
          if [ "$failed" = true ]; then
            echo "*****************************"
            echo "Programs that failed testing:"
            printf "%s\n" "${failed_tests[@]}"
            exit 1
          else
            echo "All tests passed."
          fi
        shell: bash
