name: CI Pipeline

on:
  push:
    branches:
      - main
      - master
      - develop
  pull_request:
    branches:
      - main
      - master

jobs:
  lint:
    name: Code Linting
    runs-on: ubuntu-latest

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

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '18'
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: Run ESLint
        run: npm run lint
        continue-on-error: false

  test:
    name: Run Tests
    runs-on: ubuntu-latest

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

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '18'
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

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

      - name: Check coverage threshold
        run: |
          echo "Checking test coverage meets minimum threshold of 70%..."
          COVERAGE=$(cat coverage/coverage-summary.json | grep -o '"lines":{"total":[0-9]*,"covered":[0-9]*,"skipped":[0-9]*,"pct":[0-9.]*' | grep -o 'pct":[0-9.]*' | cut -d':' -f2)
          echo "Current coverage: ${COVERAGE}%"
          if (( $(echo "$COVERAGE < 70" | bc -l) )); then
            echo "❌ Coverage ${COVERAGE}% is below minimum threshold of 70%"
            exit 1
          else
            echo "✅ Coverage ${COVERAGE}% meets threshold"
          fi

      - name: Archive test results
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: test-results
          path: coverage/
          retention-days: 30

  build-verification:
    name: Build Verification
    runs-on: ubuntu-latest
    needs: [lint, test]

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

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '18'
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: Verify package.json
        run: |
          echo "Verifying package.json structure..."
          node -e "const pkg = require('./package.json'); console.log('✅ Package name:', pkg.name); console.log('✅ Version:', pkg.version);"

      - name: Check for JavaScript syntax errors
        run: |
          echo "Checking JavaScript files for syntax errors..."
          find js -name "*.js" -type f -exec node --check {} \;
          echo "✅ All JavaScript files are valid"

      - name: Verify critical files exist
        run: |
          echo "Verifying critical project files..."
          test -f index.html || { echo "❌ index.html not found"; exit 1; }
          test -d js || { echo "❌ js directory not found"; exit 1; }
          test -f js/main.js || { echo "❌ js/main.js not found"; exit 1; }
          echo "✅ All critical files present"

  quality-report:
    name: Generate Quality Report
    runs-on: ubuntu-latest
    needs: [lint, test, build-verification]
    if: always()

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

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '18'
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: Generate full coverage report
        run: npm run test:coverage
        continue-on-error: true

      - name: Generate quality summary
        run: |
          echo "# Quality Report" > quality-report.md
          echo "" >> quality-report.md
          echo "## Test Results" >> quality-report.md
          if [ -f coverage/coverage-summary.json ]; then
            echo "- Lines: $(cat coverage/coverage-summary.json | grep -o '"lines":{"total":[0-9]*,"covered":[0-9]*,"skipped":[0-9]*,"pct":[0-9.]*' | grep -o 'pct":[0-9.]*' | cut -d':' -f2)%" >> quality-report.md
            echo "- Statements: $(cat coverage/coverage-summary.json | grep -o '"statements":{"total":[0-9]*,"covered":[0-9]*,"skipped":[0-9]*,"pct":[0-9.]*' | grep -o 'pct":[0-9.]*' | cut -d':' -f2)%" >> quality-report.md
            echo "- Functions: $(cat coverage/coverage-summary.json | grep -o '"functions":{"total":[0-9]*,"covered":[0-9]*,"skipped":[0-9]*,"pct":[0-9.]*' | grep -o 'pct":[0-9.]*' | cut -d':' -f2)%" >> quality-report.md
            echo "- Branches: $(cat coverage/coverage-summary.json | grep -o '"branches":{"total":[0-9]*,"covered":[0-9]*,"skipped":[0-9]*,"pct":[0-9.]*' | grep -o 'pct":[0-9.]*' | cut -d':' -f2)%" >> quality-report.md
          fi
          echo "" >> quality-report.md
          echo "## Build Info" >> quality-report.md
          echo "- Node Version: $(node --version)" >> quality-report.md
          echo "- NPM Version: $(npm --version)" >> quality-report.md
          echo "- Commit: ${{ github.sha }}" >> quality-report.md
          echo "- Branch: ${{ github.ref_name }}" >> quality-report.md
          cat quality-report.md

      - name: Upload quality report
        uses: actions/upload-artifact@v4
        with:
          name: quality-report
          path: quality-report.md
          retention-days: 90
