on:
  push:
    branches: main

jobs:
  test:
    strategy:
      matrix:
        os: [ubuntu-latest, ubuntu-20.04, windows-latest]
        version: [18,20]
    runs-on: ${{ matrix.os }}
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: Setup Node
        uses: actions/setup-node@v3
        with:
          node-version: ${{ matrix.version }}
      - run: npm ci
      - run: npm test

  publish:
    needs: test
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - name: Setup Node
        uses: actions/setup-node@v3
        with:
          node-version: "18"
          registry-url: "https://registry.npmjs.org"
      - name: Check Version Change
        id: check
        uses: EndBug/version-check@v2
      - name: Get previous tag
        id: previousTag
        run: |
          name=$(git --no-pager tag --sort=creatordate --merged ${{ github.ref_name }} | tail -1)
          echo "previousTag: $name"
          echo "previousTag=$name" >> $GITHUB_ENV
      

      - name: Create and Tag Release
        if: steps.check.outputs.changed == 'true'
        id: createrelease
        uses: actions/create-release@latest
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token
        with:
          tag_name: v${{ steps.check.outputs.version }}
          release_name: v${{ steps.check.outputs.version }}
          draft: false
          prerelease: false
      - name: "✏️ Generate release changelog"
        if: steps.check.outputs.changed == 'true'
        id: changelog
        uses: requarks/changelog-action@v1
        with:
          token: ${{ github.token }}
          fromTag: v${{ steps.check.outputs.version }}
          toTag: ${{ env.previousTag }}
          writeToFile: true

      - name: Edit Release
        if: steps.check.outputs.changed == 'true'
        uses: irongut/EditRelease@v1.2.0
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          id: ${{ steps.createrelease.outputs.id }}
          body: ${{ steps.changelog.outputs.changes }}
          
      - name: Commit CHANGELOG.md
        if: steps.check.outputs.changed == 'true'
        uses: stefanzweifel/git-auto-commit-action@v4
        with:
          branch: main
          commit_message: 'docs: update CHANGELOG.md for v${{ steps.check.outputs.version }} [skip ci]'
          file_pattern: CHANGELOG.md
      
      - name: Publish to npm
        if: steps.check.outputs.changed == 'true'
        run: npm publish
        env: 
          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
        
      - name: No Version Change
        if: steps.check.outputs.changed == 'false'
        run: echo no version change detected... Skipping publish and release
      

        

  