name: Main
on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - '**'
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Use Node.js 18.16.0
        uses: actions/setup-node@v4
        with:
          node-version: 18.16.0
      - name: Configure Yarn cache
        uses: actions/cache@v4
        with:
          key: ${{ runner.os }}-yarn-${{ hashFiles('./yarn.lock') }}
          path: ./node_modules
          restore-keys: |
            ${{ runner.os }}-yarn-
      - name: Install dependencies
        run: yarn --pure-lockfile
      - name: Test
        run: npm run test:ci
      - name: Fix coverage-final.json Paths Before Upload
        run: sed -i 's|/work/|/_work/|g' coverage/coverage-final.json
      - name: Upload Coverage report
        uses: actions/upload-artifact@v4.4.3
        with:
          name: coverage-report
          path: |
            coverage/coverage-final.json
            coverage/lcov.info
  scan:
    name: SonarQube Scan
    needs: [test]
    runs-on: ['arc-runner-spot'] # Self-hosted runner
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: 0 # Ensures full commit history for better analysis
      - name: Download coverage report
        uses: actions/download-artifact@v4
        with:
          name: coverage-report
          path: coverage/
      - name: Run SonarQube Scan
        uses: sonarsource/sonarqube-scan-action@master
        env:
          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
          SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }}
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Use Node.js 18.16.0
        uses: actions/setup-node@v4
        with:
          node-version: 18.16.0
      - name: Configure Yarn cache
        uses: actions/cache@v4
        with:
          key: ${{ runner.os }}-yarn-${{ hashFiles('./yarn.lock') }}
          path: ./node_modules
          restore-keys: |
            ${{ runner.os }}-yarn-
      - name: Install dependencies
        run: yarn --pure-lockfile
      - name: Lint
        run: npm run lint
