name: build_release

on:
  schedule:
    - cron: '0 19 * * *'
  workflow_dispatch:

jobs:
  check_changes:
    runs-on: ubuntu-latest
    outputs:
      changed: ${{ steps.changes.outputs.changed }}
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - id: changes
        run: |
          prev_tag=$(git describe --tags --abbrev=0 2>/dev/null || echo "none")
          if [ "$prev_tag" == "none" ]; then
            echo "changed=true" >> $GITHUB_OUTPUT
          else
            if git diff --exit-code $prev_tag HEAD -- src; then
              echo "No changes detected in 'src' directory between $prev_tag and the latest commit."
              echo "changed=false" >> $GITHUB_OUTPUT
            else
              echo "changed=true" >> $GITHUB_OUTPUT
            fi
          fi

  build_release:
    needs: check_changes
    if: ${{ needs.check_changes.outputs.changed == 'true' }}
    runs-on: ubuntu-latest
    outputs:
      version: ${{ steps.version.outputs.version }}
      changes_detected: ${{ steps.changes.outputs.changed }}
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - uses: actions/setup-node@v4
        with:
          node-version: 22

      - uses: pnpm/action-setup@v4

      - run: pnpm install

      - run: pnpm run build

      - id: version
        run: |
          version=$(node -e "import('@gkd-kit/tools').then((m) => m.stdoutGkdVersion());")
          echo "version=${version}" >> "$GITHUB_OUTPUT"

      - name: Git commit
        id: commit
        run: |
          git config --local user.email github-actions[bot]@users.noreply.github.com
          git config --local user.name github-actions[bot]
          git status
          git add .
          git commit -a -m "chore: v${{steps.version.outputs.version}}"
        continue-on-error: true

      - name: Git push
        if: ${{ steps.commit.outcome == 'success' }}
        uses: ad-m/github-push-action@master
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          branch: ${{ github.ref }}
          tags: true

      - name: Create Release
        id: create_release
        if: ${{ steps.commit.outcome == 'success' }}
        uses: actions/create-release@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          tag_name: v${{ steps.version.outputs.version }}
          release_name: Release ${{ steps.version.outputs.version }}
          body_path: ./dist/CHANGELOG.md

      - name: Publish package
        env:
          NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
        if: ${{ steps.commit.outcome == 'success' && env.NPM_TOKEN != '' }}
        run: |
          pnpm config set //registry.npmjs.org/:_authToken ${{ secrets.NPM_TOKEN }}
          node -e "import('@gkd-kit/tools').then((m) => m.updatePkgVersion());"
          pnpm publish --no-git-checks
          node -e "import('@gkd-kit/tools').then((m) => m.syncNpmmirror());"
