name: CI

on:
  push:
    branches: [1.x]
  pull_request_target:
  release:
    types: [created]

env:
  GITHUB_API_TOKEN: ${{ secrets.GH_API_TOKEN }}

jobs:
  tests:
    name: PHP ${{ matrix.php }}
    runs-on: ubuntu-latest
    strategy:
      matrix:
        php: [8.0, 8.1, 8.2]
    steps:
      - uses: zenstruck/.github/actions/php-test-symfony@main
        with:
          php: ${{ matrix.php }}
          deps: highest

  build-phar:
    name: Build PHAR
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: 8.0
          coverage: none

      - name: Install dependencies
        uses: ramsey/composer-install@v3

      - name: Download Box
        run: wget https://github.com/box-project/box/releases/download/3.16.0/box.phar

      - name: Update Version
        if: github.event_name == 'release'
        run: sed -i "s/@dev/$TAG/" bin/changelog
        env:
          TAG: ${{ github.event.release.tag_name }}

      - name: Compile PHAR
        run: php box.phar compile

      - uses: actions/upload-artifact@v4
        name: Upload the PHAR artifact
        with:
          name: changelog.phar
          path: bin/changelog.phar

  composer-validate:
    uses: zenstruck/.github/.github/workflows/php-composer-validate.yml@main

  test-phar:
    runs-on: ubuntu-latest
    name: Test PHAR
    needs:
      - build-phar
      - tests
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: 8.0
          coverage: none

      - uses: actions/download-artifact@v4
        with:
          name: changelog.phar
          path: .

      - name: Prepare PHAR
        run: |
          mv changelog.phar changelog
          chmod +x changelog

      - name: Test generate
        run: |
          ./changelog

      - name: Test self-update/rollback
        if: github.event_name != 'release'
        run: |
          ./changelog --version
          ./changelog self-update
          ./changelog --version
#          ./changelog self-update --rollback
#          ./changelog --version

  publish-phar:
    runs-on: ubuntu-latest
    name: Publish PHAR
    needs:
      - composer-validate
      - test-phar
    if: github.event_name == 'release'
    steps:
      - uses: actions/download-artifact@v4
        with:
          name: changelog.phar
          path: .

      - name: Upload changelog.phar
        uses: shogo82148/actions-upload-release-asset@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ github.event.release.upload_url }}
          asset_path: changelog.phar
          asset_name: changelog.phar
          asset_content_type: application/zip

  fixcs:
    name: Run php-cs-fixer
    needs: [composer-validate, test-phar]
    if: (github.event_name == 'push' || github.event_name == 'schedule') && !startsWith(github.ref, 'refs/tags') && github.repository_owner == 'zenstruck'
    runs-on: ubuntu-latest
    steps:
      - uses: zenstruck/.github/actions/php-cs-fixer@main
        with:
          php: 8
          key: ${{ secrets.GPG_PRIVATE_KEY }}
          token: ${{ secrets.COMPOSER_TOKEN }}

  sync-with-template:
    name: Sync meta files
    needs: [composer-validate, test-phar]
    if: (github.event_name == 'push' || github.event_name == 'schedule') && !startsWith(github.ref, 'refs/tags') && github.repository_owner == 'zenstruck'
    runs-on: ubuntu-latest
    steps:
      - uses: zenstruck/.github/actions/sync-with-template@main
        with:
          key: ${{ secrets.GPG_PRIVATE_KEY }}
          token: ${{ secrets.COMPOSER_TOKEN }}