name: Release

on:
  push:
    branches: [master]

jobs:
  release:
    runs-on: ubuntu-latest
    permissions:
      contents: write
      id-token: write
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - uses: actions/setup-node@v4
        with:
          node-version: 22
          registry-url: https://registry.npmjs.org

      - name: Check if release branch merge
        id: check
        run: |
          COMMIT_MSG=$(git log -1 --pretty=%B)
          MERGE_BRANCH=$(echo "$COMMIT_MSG" | sed -n 's/^Merge pull request #[0-9]* from [^/]*\/\(.*\)$/\1/p' || echo "")
          if echo "$MERGE_BRANCH" | grep -qE '^[0-9]{4}-[0-9]{2}-[0-9]{2}_release-v'; then
            echo "is_release=true" >> $GITHUB_OUTPUT
          elif echo "$COMMIT_MSG" | grep -qE '^[0-9]{4}-[0-9]{2}-[0-9]{2}_release-v'; then
            echo "is_release=true" >> $GITHUB_OUTPUT
          else
            echo "is_release=false" >> $GITHUB_OUTPUT
          fi

      - name: Setup
        if: steps.check.outputs.is_release == 'true'
        run: npm ci

      - name: Build and test
        if: steps.check.outputs.is_release == 'true'
        run: |
          npm run typecheck
          npm test
          npm run build

      - name: Read version
        if: steps.check.outputs.is_release == 'true'
        id: version
        run: echo "version=$(node -p "require('./package.json').version")" >> $GITHUB_OUTPUT

      - name: Check if prerelease
        if: steps.check.outputs.is_release == 'true'
        id: pre
        run: |
          if echo "${{ steps.version.outputs.version }}" | grep -q '-'; then
            echo "tag=dev" >> $GITHUB_OUTPUT
            echo "prerelease=true" >> $GITHUB_OUTPUT
          else
            echo "tag=latest" >> $GITHUB_OUTPUT
            echo "prerelease=false" >> $GITHUB_OUTPUT
          fi

      - name: Create tag
        if: steps.check.outputs.is_release == 'true'
        run: |
          git tag "v${{ steps.version.outputs.version }}" || true
          git push origin "v${{ steps.version.outputs.version }}" || true

      - name: Publish
        if: steps.check.outputs.is_release == 'true'
        run: npm publish --tag ${{ steps.pre.outputs.tag }} --access public
        env:
          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

      - name: Create GitHub Release
        if: steps.check.outputs.is_release == 'true'
        uses: actions/create-release@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          tag_name: v${{ steps.version.outputs.version }}
          release_name: v${{ steps.version.outputs.version }}
          prerelease: ${{ steps.pre.outputs.prerelease }}
          body: |
            ## Release v${{ steps.version.outputs.version }}

            See [commits since last tag](https://github.com/${{ github.repository }}/compare/$(git describe --tags --abbrev=0 v${{ steps.version.outputs.version }}^ 2>/dev/null || echo HEAD~10)...v${{ steps.version.outputs.version }})
