name: Python CI

on:
  push:
    branches: [ main, master, develop ]
    paths-ignore:
      - 'coverage*.svg'
      - 'README.md'
  pull_request:
    branches: [ main, master, develop ]

jobs:
  test:
    runs-on: self-hosted
    strategy:
      matrix:
        python-version: ['3.10', '3.12', '3.13']
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: ${{ matrix.python-version }}
          
      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          # Install package in development mode
          pip install -e .
          # Install test dependencies if they exist
          if [ -f requirements-dev.txt ]; then pip install -r requirements-dev.txt; fi
          if [ -f requirements/test.txt ]; then pip install -r requirements/test.txt; fi
          # Install common test packages
          pip install pytest pytest-cov flake8 coverage-badge interrogate
          
      - name: Download initial failed badges
        run: |
          echo "Downloading initial failed badges..."
          
          # Create cov_info directory first
          mkdir -p cov_info
          
          # Download failed badges as defaults
          curl -o cov_info/coverage.svg "https://img.shields.io/badge/coverage-failed-red.svg"
          curl -o cov_info/coverage-docs.svg "https://img.shields.io/badge/docs-failed-red.svg"
          
          echo "Initial failed badges created:"
          ls -la cov_info/coverage*.svg
          
      - name: Run tests with pytest
        id: pytest
        continue-on-error: true
        run: |
          # Run tests with coverage
          python -m pytest tests/ -v --cov=pyWebLayout --cov-report=term-missing --cov-report=json --cov-report=html --cov-report=xml
          
      - name: Check documentation coverage
        id: docs
        continue-on-error: true
        run: |
          # Generate documentation coverage report
          interrogate -v --ignore-init-method --ignore-init-module --ignore-magic --ignore-private --ignore-property-decorators --ignore-semiprivate --fail-under=80 pyWebLayout/
          
      - name: Lint with flake8
        run: |
          # Stop the build if there are Python syntax errors or undefined names
          flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
          # Exit-zero treats all errors as warnings
          flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
          
      - name: Create coverage info directory
        if: always()
        run: |
          mkdir -p cov_info
          echo "Created cov_info directory for coverage data"
          
      - name: Update test coverage badge on success
        if: steps.pytest.outcome == 'success' && always()
        run: |
          echo "Tests passed! Generating successful coverage badge..."
          
          if [ -f coverage.json ]; then
            coverage-badge -o cov_info/coverage.svg -f
            echo "✅ Test coverage badge updated with actual results"
          else
            echo "⚠️ No coverage.json found, keeping failed badge"
          fi
          
      - name: Update docs coverage badge on success  
        if: steps.docs.outcome == 'success' && always()
        run: |
          echo "Docs check passed! Generating successful docs badge..."
          
          # Remove existing badge first to avoid overwrite error  
          rm -f cov_info/coverage-docs.svg
          interrogate --generate-badge cov_info/coverage-docs.svg pyWebLayout/
          echo "✅ Docs coverage badge updated with actual results"
          
      - name: Generate coverage reports
        if: steps.pytest.outcome == 'success'
        run: |
          # Generate coverage summary for README
          python -c "
          import json
          import os
          # Read coverage data
          if os.path.exists('coverage.json'):
              with open('coverage.json', 'r') as f:
                  coverage_data = json.load(f)
              total_coverage = round(coverage_data['totals']['percent_covered'], 1)
              # Create coverage summary file in cov_info directory
              with open('cov_info/coverage-summary.txt', 'w') as f:
                  f.write(f'{total_coverage}%')
              print(f'Test Coverage: {total_coverage}%')
              covered_lines = coverage_data['totals']['covered_lines']
              total_lines = coverage_data['totals']['num_statements']
              print(f'Lines Covered: {covered_lines}/{total_lines}')
          else:
              print('No coverage data found')
          "
          
          # Copy other coverage files to cov_info
          if [ -f coverage.json ]; then cp coverage.json cov_info/; fi
          if [ -f coverage.xml ]; then cp coverage.xml cov_info/; fi
          if [ -d htmlcov ]; then cp -r htmlcov cov_info/; fi
          
      - name: Final badge status
        if: always()
        run: |
          echo "=== FINAL BADGE STATUS ==="
          echo "Test outcome: ${{ steps.pytest.outcome }}"
          echo "Docs outcome: ${{ steps.docs.outcome }}"
          
          if [ -f cov_info/coverage.svg ]; then
            echo "✅ Test coverage badge: $(ls -lh cov_info/coverage.svg)"
          else
            echo "❌ Test coverage badge: MISSING"
          fi
          
          if [ -f cov_info/coverage-docs.svg ]; then
            echo "✅ Docs coverage badge: $(ls -lh cov_info/coverage-docs.svg)"
          else
            echo "❌ Docs coverage badge: MISSING"
          fi
          
          echo "Coverage info directory contents:"
          ls -la cov_info/ 2>/dev/null || echo "No cov_info directory found"
          
      - name: Upload coverage artifacts
        uses: actions/upload-artifact@v3
        with:
          name: coverage-reports
          path: |
            cov_info/
            
      - name: Commit badges to badges branch
        if: github.ref == 'refs/heads/master'
        run: |
          git config --local user.email "action@gitea.local"
          git config --local user.name "Gitea Action"
          
          # Set the remote URL to use the token
          git remote set-url origin https://${{ secrets.PUSH_TOKEN }}@gitea.tourolle.paris/dtourolle/pyWebLayout.git
          
          # Create a new orphan branch for badges (this discards any existing badges branch)
          git checkout --orphan badges
          
          # Remove all files except cov_info
          find . -maxdepth 1 -not -name '.git' -not -name 'cov_info' -exec rm -rf {} + 2>/dev/null || true
          
          # Add only the coverage info directory
          git add -f cov_info/
          
          # Always commit (force overwrite)
          echo "Force updating badges branch with new coverage data..."
          git commit -m "Update coverage badges [skip ci]"
          git push -f origin badges
