name: CI

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]
    
concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  lint:
    name: Lint Python
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Setup Python
        uses: actions/setup-python@v5
        with:
          python-version: '3.11'

      - name: Install uv
        uses: astral-sh/setup-uv@v4
        with:
          enable-cache: true

      - name: Install dependencies
        run: uv sync --project core --group dev

      - name: Ruff lint
        run: |
          uv run --project core ruff check core/
          uv run --project core ruff check tools/

      - name: Ruff format
        run: |
          uv run --project core ruff format --check core/
          uv run --project core ruff format --check tools/

  test:
    name: Test Python Framework
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-latest, windows-latest]
    steps:
      - uses: actions/checkout@v4

      - name: Setup Python
        uses: actions/setup-python@v5
        with:
          python-version: '3.11'

      - name: Install uv
        uses: astral-sh/setup-uv@v4
        with:
          enable-cache: true

      - name: Install dependencies and run tests
        working-directory: core
        run: |
          uv sync
          uv run pytest tests/ -v --ignore=tests/dummy_agents

  test-tools:
    name: Test Tools (${{ matrix.os }})
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-latest, windows-latest]
    steps:
      - uses: actions/checkout@v4

      - name: Setup Python
        uses: actions/setup-python@v5
        with:
          python-version: '3.11'

      - name: Install uv
        uses: astral-sh/setup-uv@v4
        with:
          enable-cache: true

      - name: Install dependencies and run tests
        working-directory: tools
        run: |
          uv sync --extra dev
          uv run pytest tests/ -v

  validate:
    name: Validate Agent Exports
    runs-on: ubuntu-latest
    needs: [lint, test, test-tools]
    steps:
      - uses: actions/checkout@v4

      - name: Setup Python
        uses: actions/setup-python@v5
        with:
          python-version: '3.11'

      - name: Install uv
        uses: astral-sh/setup-uv@v4
        with:
          enable-cache: true
            
      - name: Install dependencies
        working-directory: core
        run: |
          uv sync

      - name: Validate exported agents
        run: |
          # Check that agent exports have valid structure
          if [ ! -d "exports" ]; then
            echo "No exports/ directory found, skipping validation"
            exit 0
          fi

          shopt -s nullglob
          agent_dirs=(exports/*/)
          shopt -u nullglob

          if [ ${#agent_dirs[@]} -eq 0 ]; then
            echo "No agent directories in exports/, skipping validation"
            exit 0
          fi

          validated=0
          for agent_dir in "${agent_dirs[@]}"; do
            if [ -f "$agent_dir/agent.json" ]; then
              echo "Validating $agent_dir"
              uv run python -c "import json; json.load(open('$agent_dir/agent.json'))"
              validated=$((validated + 1))
            fi
          done

          if [ "$validated" -eq 0 ]; then
            echo "No agent.json files found in exports/, skipping validation"
          else
            echo "Validated $validated agent(s)"
          fi
