name: CI

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

env:
  # 确保 pnpm 使用正确的缓存
  PNPM_CACHE_FOLDER: .pnpm-store

jobs:
  # 代码质量检查
  lint:
    name: Code Quality
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v7

      - name: Setup pnpm & Node.js
        uses: pnpm/setup@v2.1.0
        with:
          runtime: node@24
          cache: true
          require-lockfile: true

      - name: Run oxlint
        run: pnpm run lint

      - name: Check formatting
        run: pnpm run format:check

      - name: Check TypeScript types
        run: pnpm run typecheck

  # 测试和覆盖率
  test:
    name: Test & Coverage
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node: [22, 24]

    steps:
      - name: Checkout code
        uses: actions/checkout@v7

      - name: Setup pnpm & Node.js ${{ matrix.node }}
        uses: pnpm/setup@v2.1.0
        with:
          runtime: node@${{ matrix.node }}
          cache: true
          require-lockfile: true

      - name: Run tests with coverage
        run: pnpm run test:coverage

      - name: Upload coverage to Codecov
        if: matrix.node == 24
        uses: codecov/codecov-action@v7
        with:
          files: ./coverage/lcov.info
          flags: unittests
          name: codecov-umbrella
          fail_ci_if_error: false
        env:
          CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}

  # 构建测试
  build:
    name: Build Test
    runs-on: ubuntu-latest
    needs: [lint]

    steps:
      - name: Checkout code
        uses: actions/checkout@v7

      - name: Setup pnpm & Node.js
        uses: pnpm/setup@v2.1.0
        with:
          runtime: node@24
          cache: true
          require-lockfile: true

      - name: Build project
        run: pnpm run build

      - name: Check build outputs
        run: |
          ls -la dist/
          echo "✅ CJS build:" && ls -la dist/index.cjs
          echo "✅ ESM build:" && ls -la dist/index.mjs
          echo "✅ IIFE build:" && ls -la dist/index.iife.js
          echo "✅ Worker builds:" && ls -la dist/index.worker.js dist/index.sharedworker.js
          echo "✅ Type definitions:" && ls -la dist/index.d.ts

      - name: Upload build artifacts
        uses: actions/upload-artifact@v7
        with:
          name: build-artifacts
          path: dist/
          retention-days: 7

  # 浏览器兼容性测试 (可选)
  browser-test:
    name: Browser Compatibility
    runs-on: ubuntu-latest
    needs: [build]

    steps:
      - name: Checkout code
        uses: actions/checkout@v7

      - name: Setup pnpm & Node.js
        uses: pnpm/setup@v2.1.0
        with:
          runtime: node@24
          cache: true
          require-lockfile: true

      - name: Download build artifacts
        uses: actions/download-artifact@v7
        with:
          name: build-artifacts
          path: dist/

      - name: Test browser examples
        run: |
          # 启动HTTP服务器测试浏览器示例
          pnpm run serve &
          SERVER_PID=$!
          sleep 5

          # 简单检查示例页面是否可访问
          curl -f http://localhost:8000/examples/browser/ || echo "Browser example server check"

          # 清理
          kill $SERVER_PID 2>/dev/null || true

  # 发布预检查
  release-check:
    name: Release Readiness
    runs-on: ubuntu-latest
    needs: [lint, test, build]
    if: github.ref == 'refs/heads/main'

    steps:
      - name: Checkout code
        uses: actions/checkout@v7

      - name: Setup pnpm
        uses: pnpm/setup@v2.1.0
        with:
          install: false
          cache: true

      - name: Setup Node.js
        uses: actions/setup-node@v7
        with:
          node-version: '24.20.0'
          cache: 'pnpm'
          registry-url: 'https://registry.npmjs.org'

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

      # dry-run 只验证 release 流程本身，不发包，因此跳过 npm 认证检查。
      # 真实发布的认证走 Trusted Publisher (OIDC)，见 release.yml。
      - name: Test release workflow (dry run)
        run: pnpm exec release-it --dry-run --ci --npm.skipChecks
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

  # 状态检查总结
  ci-success:
    name: CI Success
    runs-on: ubuntu-latest
    needs: [lint, test, build, browser-test]
    if: always()

    steps:
      - name: Check all jobs status
        run: |
          if [ "${{ needs.lint.result }}" != "success" ] || \
             [ "${{ needs.test.result }}" != "success" ] || \
             [ "${{ needs.build.result }}" != "success" ] || \
             [ "${{ needs.browser-test.result }}" != "success" ]; then
            echo "❌ Some CI jobs failed"
            exit 1
          else
            echo "✅ All CI jobs passed successfully!"
          fi
