name: Build and Publish

on:
  push:
    tags:
      - v*.*.*

jobs:
  build-and-publish:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3

      - name: Get tag
        id: source_tag
        run: |
          echo "SOURCE_TAG=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT

      - name: Get package version
        id: source_ver
        run: |
          echo "SOURCE_VER=v$(grep version ./package.json | sed -n 's/^.*"\([0-9][^"]*\)".*$/\1/p')" >> $GITHUB_OUTPUT

      - name: Do tag and version match?
        if: steps.source_tag.outputs.SOURCE_TAG != steps.source_ver.outputs.SOURCE_VER
        run: |
          echo ${{ steps.source_tag.outputs.SOURCE_TAG }}
          echo ${{ steps.source_ver.outputs.SOURCE_VER }}
          echo "::error Tag does not match version"
          exit -1

      - name: Setup node
        uses: actions/setup-node@v3
        with:
          node-version: '16.x'
          registry-url: 'https://registry.npmjs.org'
          always-auth: true

      - name: Build
        run: |
          npm install -g yarn
          yarn install
          tsc && mkdir -p dist/nodes
          cp src/nodes/*.js dist/nodes/
          cp src/nodes/*.html dist/nodes/
          cp -r src/nodes/icons dist/nodes/
          mkdir -p dist/nodes/common
          cp src/mobsearch.js dist/nodes/common/
          cp src/node-red-ui-funcs.js dist/
        env:
          GH_PKG_READ_TOKEN: ${{ secrets.GH_PKG_READ_TOKEN }}

      - name: Publish package
        run: |
          npm publish
        env:
          NODE_AUTH_TOKEN: ${{ secrets.NPM_WRITE_TOKEN }}

      - name: Create release
        env:
          RELEASE_TYPE: ${{ contains(steps.source_ver.outputs.SOURCE_VER, '-') }}
          RELEASE_TAG: ${{ steps.source_ver.outputs.SOURCE_VER }}
        uses: actions/github-script@v6
        with:
          github-token: ${{ secrets.MOBIUS_ACTION_TOKEN }}
          script: |
            try {
              await github.rest.repos.createRelease({
                draft: false,
                generate_release_notes: true,
                name: process.env.RELEASE_TAG,
                owner: context.repo.owner,
                prerelease: process.env.RELEASE_TYPE === 'true',
                repo: context.repo.repo,
                tag_name: process.env.RELEASE_TAG,
              });
            } catch (error) {
              core.setFailed(error.message);
            }
