name: CI

on:
  push:
    branches: [main]
    paths:
      - src/**
      - package.json
      - tsconfig.json
      - bun.lock
      - .github/workflows/ci.yml
  pull_request:
    branches: [main]
    paths:
      - src/**
      - package.json
      - tsconfig.json
      - bun.lock
      - .github/workflows/ci.yml

concurrency:
  group: ci-${{ github.ref }}
  cancel-in-progress: true

jobs:
  test:
    runs-on: ubuntu-latest
    timeout-minutes: 15
    steps:
      - uses: actions/checkout@v5

      - name: Setup Bun
        uses: oven-sh/setup-bun@v2
        with:
          bun-version: latest

      - name: Install dependencies
        run: bun install --frozen-lockfile

      - name: Build
        run: bun run build

      - name: Test
        run: bun test

  publish:
    needs: test
    runs-on: ubuntu-latest
    timeout-minutes: 15
    if: github.ref == 'refs/heads/main' && github.event_name == 'push'
    permissions:
      contents: read
      packages: write
    steps:
      - uses: actions/checkout@v5

      - name: Setup Bun
        uses: oven-sh/setup-bun@v2
        with:
          bun-version: latest

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'
          registry-url: 'https://npm.pkg.github.com'
          scope: '@corvidlabs'

      - name: Install dependencies
        run: bun install --frozen-lockfile

      - name: Build
        run: bun run build

      - name: Check if version changed
        id: version
        run: |
          PUBLISHED=$(npm view @corvidlabs/ts-algochat version 2>/dev/null || echo "0.0.0")
          CURRENT=$(node -p "require('./package.json').version")
          if [ "$PUBLISHED" != "$CURRENT" ]; then
            echo "changed=true" >> $GITHUB_OUTPUT
          fi
        env:
          NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Publish to GitHub Packages
        if: steps.version.outputs.changed == 'true'
        run: npm publish
        env:
          NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
