name: CI

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

# Cancel older CI runs for the same branch when a new commit arrives —
# saves minutes when someone pushes a stack of fixes to one PR.
concurrency:
  group: ci-${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  check:
    name: Lint, typecheck, test, build
    runs-on: ubuntu-latest
    # Dummy env vars so `next build` doesn't fail when it reads the
    # public Supabase config at build time. These never leave CI and
    # never hit a real service — they just satisfy the `!` non-null
    # assertions in the client factories. ENCRYPTION_KEY and
    # META_APP_SECRET are read at module-load by lib/whatsapp/*; the
    # test suite asserts behaviour around these values, so any non-
    # empty placeholder works as long as it stays consistent with
    # vitest.config.ts.
    env:
      NEXT_PUBLIC_SUPABASE_URL: https://ci.example.supabase.co
      NEXT_PUBLIC_SUPABASE_ANON_KEY: ci-dummy-anon-key
      ENCRYPTION_KEY: '0000000000000000000000000000000000000000000000000000000000000000'
      META_APP_SECRET: 'ci-dummy-meta-secret'
    steps:
      - uses: actions/checkout@v7

      - uses: actions/setup-node@v6
        with:
          node-version: 20
          cache: npm

      - name: Install dependencies
        run: npm ci

      - name: Lint
        run: npm run lint

      - name: Typecheck
        run: npm run typecheck

      - name: Test
        run: npm test

      - name: Build
        run: npm run build
