name: Code QA Roo Code

on:
    workflow_dispatch:
    push:
        branches: [main]
    pull_request:
        types: [opened, reopened, ready_for_review, synchronize]
        branches: [main]

jobs:
    check-translations:
        runs-on: ubuntu-latest
        steps:
            - name: Checkout code
              uses: actions/checkout@v4
            - name: Setup Node.js and pnpm
              uses: ./.github/actions/setup-node-pnpm
            - name: Verify all translations are complete
              run: node scripts/find-missing-translations.js

    knip:
        runs-on: ubuntu-latest
        steps:
            - name: Checkout code
              uses: actions/checkout@v4
            - name: Setup Node.js and pnpm
              uses: ./.github/actions/setup-node-pnpm
            - name: Run knip checks
              run: pnpm knip

    compile:
        runs-on: ubuntu-latest
        steps:
            - name: Checkout code
              uses: actions/checkout@v4
            - name: Setup Node.js and pnpm
              uses: ./.github/actions/setup-node-pnpm
            - name: Lint
              run: pnpm lint
            - name: Check types
              run: pnpm check-types

    unit-test:
        name: platform-unit-test (${{ matrix.name }})
        runs-on: ${{ matrix.os }}
        strategy:
            matrix:
                include:
                    - os: ubuntu-latest
                      name: ubuntu-latest
                    - os: windows-latest
                      name: windows-latest
        steps:
            - name: Checkout code
              uses: actions/checkout@v4
            - name: Setup Node.js and pnpm
              uses: ./.github/actions/setup-node-pnpm
            - name: Run unit tests
              run: pnpm test

    check-openrouter-api-key:
        runs-on: ubuntu-latest
        outputs:
            exists: ${{ steps.openrouter-api-key-check.outputs.defined }}
        steps:
            - name: Check if OpenRouter API key exists
              id: openrouter-api-key-check
              shell: bash
              run: |
                  if [ "${{ secrets.OPENROUTER_API_KEY }}" != '' ]; then
                    echo "defined=true" >> $GITHUB_OUTPUT;
                  else
                    echo "defined=false" >> $GITHUB_OUTPUT;
                  fi

    integration-test:
        runs-on: ubuntu-latest
        needs: [check-openrouter-api-key]
        if: needs.check-openrouter-api-key.outputs.exists == 'true'
        steps:
            - name: Checkout code
              uses: actions/checkout@v4
            - name: Setup Node.js and pnpm
              uses: ./.github/actions/setup-node-pnpm
            - name: Create .env.local file
              working-directory: apps/vscode-e2e
              run: echo "OPENROUTER_API_KEY=${{ secrets.OPENROUTER_API_KEY }}" > .env.local
            - name: Run integration tests
              working-directory: apps/vscode-e2e
              run: xvfb-run -a pnpm test:ci

    notify-slack-on-failure:
        runs-on: ubuntu-latest
        needs: [check-translations, knip, compile, unit-test, integration-test]
        if: ${{ always() && github.event_name == 'push' && github.ref == 'refs/heads/main' && contains(needs.*.result, 'failure') }}
        steps:
            - name: Checkout code
              uses: actions/checkout@v4

            - name: Send Slack notification on failure
              uses: ./.github/actions/slack-notify
              with:
                  webhook-url: ${{ secrets.SLACK_WEBHOOK_URL }}
                  channel: "#ci"
                  workflow-name: "Code QA"
                  failed-jobs: ${{ toJSON(needs) }}
