name: CI Workflow

on: [push, pull_request]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3
      
      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: '8.2'
          extensions: mbstring, zip, xml, curl, intl, sqlite, gd, pdo_mysql
          tools: cs2pr, phpcbf, phpcs, phpmd, phpunit

      - name: Install Composer dependencies
        run: composer install

      - name: Run phpcbf
        run: phpcbf .
        continue-on-error: ${{ github.ref != 'refs/heads/main' }}

      #- name: Commit code formatting changes
      #  if: success() && github.ref != 'refs/heads/main'
      #  run: |
      #    git config user.name "GitHub Actions"
      #    git config user.email "actions@github.com"
      #    git add src
      #    git diff --cached --quiet || (git commit -m "Update src from PHP Codesniffer" && git pull origin $(git rev-parse --abbrev-ref HEAD) --rebase --autostash && git push)

      - name: Run phpcs
        run: phpcs -q --report=checkstyle src | cs2pr
        continue-on-error: ${{ github.ref != 'refs/heads/main' }}

      - name: Run phpmd
        run: phpmd src xml phpmd.xml --not-strict
        continue-on-error: ${{ github.ref != 'refs/heads/main' }}

      - name: List files in repository root
        run: ls -alh

      - name: List files in tests directory
        run: ls -alh ./tests

      - name: List files in vendor directory
        run: ls -alh ./vendor

      - name: Run PHPUnit tests
        env:
          XDEBUG_MODE: coverage
        run: |
          phpunit --bootstrap ./tests/bootstrap.php --configuration phpunit.xml --coverage-html ./coverage --coverage-text | tee coverage.txt
        continue-on-error: ${{ github.ref != 'refs/heads/main' }}

  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Install remark presets
        run: npm install remark-cli remark-preset-lint-consistent remark-preset-lint-recommended remark-lint-list-item-indent
      - name: Run remark
        run: npx remark . --output --use remark-preset-lint-consistent --use remark-preset-lint-recommended --use remark-lint-list-item-indent
      - name: Check for linting errors
        run: |
          npx remark . --use remark-preset-lint-consistent --use remark-preset-lint-recommended --use remark-lint-list-item-indent
        continue-on-error: ${{ github.ref != 'refs/heads/main' }}
      - name: Git commit
        if: success() && github.ref != 'refs/heads/main'
        run: |
          git config user.name "GitHub Actions"
          git config user.email "actions@github.com"
          git add .
          git add package.json package-lock.json
          git diff --cached --quiet || (git commit -m "Update src from remark-lint" && git pull origin $(git rev-parse --abbrev-ref HEAD) --rebase --autostash && git push)

  checks:
    needs: [build, lint]
    runs-on: ubuntu-latest

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

      - name: Setup PHP (for checks)
        uses: shivammathur/setup-php@v2
        with:
          php-version: '8.2'
          extensions: mbstring, zip, xml, curl, intl, sqlite, gd, pdo_mysql
          tools: cs2pr, phpcs, phpmd, phpunit

      - name: Run Checks
        run: |
          if ! command -v phpcs &> /dev/null; then
            echo "phpcs could not be found. Please ensure it's installed."
            exit 1
          fi
          if ! command -v phpmd &> /dev/null; then
            echo "phpmd could not be found. Please ensure it's installed."
            exit 1
          fi
          if phpcs -q --report=checkstyle src | grep -q "ERROR"; then
            echo "PHP CodeSniffer found issues. Please fix them before merging."
            exit 1
          fi
          if phpmd src xml phpmd.xml --strict | grep -q "ERROR"; then
            echo "PHP Mess Detector found issues. Please fix them before merging."
            exit 1
          fi
          # if ! phpunit --bootstrap ./tests/bootstrap.php --configuration phpunit.xml; then
          #  echo "PHPUnit tests failed. Please fix them before merging."
          #  exit 1
          #fi
          if ! npx remark . --use remark-preset-lint-consistent --use remark-preset-lint-recommended --use remark-lint-list-item-indent; then
            echo "Markdown linting failed. Please fix them before merging."
            exit 1
          fi
        continue-on-error: false