# Gitea Actions CI Pipeline
# BreakPilot Lehrer
#
# Services:
#   Go: school-service, edu-search-service
#   Python: klausur-service, backend-lehrer, agent-core
#   Node.js: website, admin-lehrer, studio-v2

name: CI

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

jobs:
  # ========================================
  # Lint (nur bei PRs)
  # ========================================

  go-lint:
    runs-on: docker
    if: github.event_name == 'pull_request'
    container: golangci/golangci-lint:v1.55-alpine
    steps:
      - name: Checkout
        run: |
          apk add --no-cache git
          git clone --depth 1 --branch ${GITHUB_REF_NAME} ${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}.git .
      - name: Lint Go services
        run: |
          for svc in school-service edu-search-service; do
            if [ -d "$svc" ]; then
              echo "=== Linting $svc ==="
              cd "$svc" && golangci-lint run --timeout 5m ./... || true
              cd ..
            fi
          done

  python-lint:
    runs-on: docker
    if: github.event_name == 'pull_request'
    container: python:3.12-slim
    steps:
      - name: Checkout
        run: |
          apt-get update -qq && apt-get install -y -qq git > /dev/null 2>&1
          git clone --depth 1 --branch ${GITHUB_REF_NAME} ${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}.git .
      - name: Lint Python services
        run: |
          pip install --quiet ruff
          for svc in backend-lehrer agent-core; do
            if [ -d "$svc" ]; then
              echo "=== Linting $svc ==="
              ruff check "$svc/" --output-format=github || true
            fi
          done
          if [ -d "klausur-service/backend" ]; then
            echo "=== Linting klausur-service ==="
            ruff check klausur-service/backend/ --output-format=github || true
          fi

  nodejs-lint:
    runs-on: docker
    if: github.event_name == 'pull_request'
    container: node:20-alpine
    steps:
      - name: Checkout
        run: |
          apk add --no-cache git
          git clone --depth 1 --branch ${GITHUB_REF_NAME} ${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}.git .
      - name: Lint Node.js services
        run: |
          for svc in website admin-lehrer studio-v2; do
            if [ -d "$svc" ]; then
              echo "=== Linting $svc ==="
              cd "$svc"
              npm ci --silent 2>/dev/null || npm install --silent
              npx next lint || true
              cd ..
            fi
          done

  # ========================================
  # Unit Tests
  # ========================================

  test-go-school:
    runs-on: docker
    container: golang:1.23-alpine
    env:
      CGO_ENABLED: "0"
    steps:
      - name: Checkout
        run: |
          apk add --no-cache git
          git clone --depth 1 --branch ${GITHUB_REF_NAME} ${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}.git .
      - name: Test school-service
        run: |
          if [ ! -d "school-service" ]; then
            echo "WARNUNG: school-service nicht gefunden"
            exit 0
          fi
          cd school-service
          go test -v -coverprofile=coverage.out ./... 2>&1
          COVERAGE=$(go tool cover -func=coverage.out 2>/dev/null | tail -1 | awk '{print $3}' || echo "0%")
          echo "Coverage: $COVERAGE"

  test-go-edu-search:
    runs-on: docker
    container: golang:1.23-alpine
    env:
      CGO_ENABLED: "0"
    steps:
      - name: Checkout
        run: |
          apk add --no-cache git
          git clone --depth 1 --branch ${GITHUB_REF_NAME} ${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}.git .
      - name: Test edu-search-service
        run: |
          if [ ! -d "edu-search-service" ]; then
            echo "WARNUNG: edu-search-service nicht gefunden"
            exit 0
          fi
          cd edu-search-service
          go mod download
          go test -v ./... 2>&1 || true

  test-python-klausur:
    runs-on: docker
    container: python:3.12-slim
    env:
      CI: "true"
    steps:
      - name: Checkout
        run: |
          apt-get update -qq && apt-get install -y -qq git > /dev/null 2>&1
          git clone --depth 1 --branch ${GITHUB_REF_NAME} ${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}.git .
      - name: Test klausur-service
        run: |
          if [ ! -d "klausur-service/backend" ]; then
            echo "WARNUNG: klausur-service/backend nicht gefunden"
            exit 0
          fi
          cd klausur-service/backend
          export PYTHONPATH="$(pwd):${PYTHONPATH:-}"
          pip install --quiet --no-cache-dir -r requirements.txt 2>/dev/null || true
          pip install --quiet --no-cache-dir fastapi uvicorn pytest pytest-asyncio
          python -m pytest tests/ -v --tb=short

  test-python-agent-core:
    runs-on: docker
    container: python:3.12-slim
    env:
      CI: "true"
    steps:
      - name: Checkout
        run: |
          apt-get update -qq && apt-get install -y -qq git > /dev/null 2>&1
          git clone --depth 1 --branch ${GITHUB_REF_NAME} ${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}.git .
      - name: Test agent-core
        run: |
          if [ ! -d "agent-core" ]; then
            echo "WARNUNG: agent-core nicht gefunden"
            exit 0
          fi
          # Symlink fuer Python import (Verzeichnis agent-core -> agent_core)
          ln -sf agent-core agent_core
          export PYTHONPATH="$(pwd):${PYTHONPATH:-}"
          cd agent-core
          pip install --quiet --no-cache-dir -r requirements.txt 2>/dev/null || true
          pip install --quiet --no-cache-dir pytest pytest-asyncio
          python -m pytest tests/ -v --tb=short

  test-nodejs-website:
    runs-on: docker
    container: node:20-alpine
    steps:
      - name: Checkout
        run: |
          apk add --no-cache git
          git clone --depth 1 --branch ${GITHUB_REF_NAME} ${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}.git .
      - name: Test website
        run: |
          if [ ! -d "website" ]; then
            echo "WARNUNG: website nicht gefunden"
            exit 0
          fi
          cd website
          npm ci --silent 2>/dev/null || npm install --silent
          npx jest --passWithNoTests || true
