name: CI

on:
  pull_request:
    branches: [main]

concurrency:
  group: ci-${{ github.event.pull_request.number || github.ref }}
  cancel-in-progress: true

jobs:
  changes:
    name: 🔎 Change Detection
    runs-on: ubuntu-latest
    outputs:
      frontend: ${{ steps.filter.outputs.frontend }}
    steps:
      - name: 📥 Checkout
        uses: actions/checkout@v5
      - name: 🧭 Filter paths
        id: filter
        uses: dorny/paths-filter@v3
        with:
          filters: |
            frontend:
              - 'apps/dsa-web/**'

  ai-governance:
    name: ai-governance
    runs-on: ubuntu-latest
    steps:
      - name: 📥 Checkout
        uses: actions/checkout@v5
      - name: 🐍 Setup Python
        uses: actions/setup-python@v6
        with:
          python-version: '3.11'
      - name: 🤖 Check AI governance assets
        run: python scripts/check_ai_assets.py

  backend-gate:
    name: backend-gate
    runs-on: ubuntu-latest
    needs: [ai-governance]
    steps:
      - name: 📥 Checkout
        uses: actions/checkout@v5
      - name: 🐍 Setup Python
        uses: actions/setup-python@v6
        with:
          python-version: '3.11'
          cache: 'pip'
          cache-dependency-path: |
            requirements.txt
            .github/requirements-ci.txt
      - name: 📦 Install dependencies
        run: |
          python -m pip install --upgrade pip
          for attempt in 1 2 3; do
            if python -m pip install -r .github/requirements-ci.txt; then
              break
            fi
            if [ "$attempt" -eq 3 ]; then
              echo "Dependency install failed after ${attempt} attempts." >&2
              exit 1
            fi
            echo "Dependency install attempt ${attempt} failed, retrying in 15s..." >&2
            sleep 15
          done
      - name: ✅ Python syntax check
        run: ./scripts/ci_gate.sh syntax
      - name: ✅ Flake8 critical checks
        run: ./scripts/ci_gate.sh flake8
      - name: ✅ Local deterministic checks
        run: ./scripts/ci_gate.sh deterministic
      - name: ✅ Offline test suite
        run: ./scripts/ci_gate.sh offline-tests

  docker-build:
    name: docker-build
    runs-on: ubuntu-latest
    needs: [ai-governance]
    steps:
      - name: 📥 Checkout
        uses: actions/checkout@v5
      - name: 🛠️ Setup Docker Buildx
        uses: docker/setup-buildx-action@v3
      - name: 🐳 Build image
        uses: docker/build-push-action@v6
        with:
          context: .
          file: docker/Dockerfile
          tags: stock-analysis:test
          load: true
          cache-from: type=gha,scope=stock-analysis-ci-docker
          cache-to: type=gha,mode=max,scope=stock-analysis-ci-docker,ignore-error=true
      - name: 🐳 Docker smoke
        run: docker run --rm stock-analysis:test python -c "print('✅ Docker OK')"
      - name: 🔍 Docker smoke imports
        run: |
          docker run --rm stock-analysis:test python -c "
          from src.config import get_config; print('✅ config')
          from src.storage import DatabaseManager; print('✅ storage')
          from src.notification import NotificationService; print('✅ notification')
          from data_provider import DataFetcherManager; print('✅ data_provider')
          from src.analyzer import GeminiAnalyzer; print('✅ analyzer')
          from src.patches.eastmoney_patch import eastmoney_patch; print('✅ patch')
          from bot.dispatcher import CommandDispatcher; print('✅ bot')
          from api.app import app; print('✅ api')
          print('✅ All Docker imports OK')
          "

  web-gate:
    name: web-gate
    runs-on: ubuntu-latest
    needs: [changes, ai-governance]
    if: needs.changes.outputs.frontend == 'true'
    defaults:
      run:
        working-directory: apps/dsa-web
    steps:
      - name: 📥 Checkout
        uses: actions/checkout@v5
      - name: 🟢 Setup Node
        uses: actions/setup-node@v6
        with:
          node-version: '20'
          cache: 'npm'
          cache-dependency-path: apps/dsa-web/package-lock.json
      - name: 📦 Install
        run: npm ci
      - name: 🔎 Lint
        run: npm run lint
      - name: 🏗️ Build
        run: npm run build
