name: Run npm version and push tags

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

permissions:
  contents: write
  id-token: write

on:
  workflow_dispatch:
    inputs:
      version:
        description: What version number would you like to use? The version number should be **without** a leading `v`, e.g. `5.7.1` or `6.2.4`.
      bump-main:
        description: Should we bump the package.json main version?
        required: true
        type: boolean
        default: true
      update-version-function:
        description: Should we update the version function to use this version?
        required: true
        type: boolean
        default: true

jobs:
  build:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [ 20.x ]

    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
          token: ${{ secrets.GH_PUSH_TOKEN }}
      - name: Set up git-cliff
        uses: kenji-miyake/setup-git-cliff@v2
      - name: setup git config
        run: |
          git config user.name "Github Actions Bot"
          git config user.email "<>"
      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node-version }}
          cache: 'yarn'
      - if: ${{ endsWith(github.event.inputs.version, '0') }}
        run: |
          PREV_COMMIT=$(git rev-list --tags --max-count=1)
          echo PREV=$(git describe --tags ${PREV_COMMIT}) >> $GITHUB_ENV
      - if: ${{ !endsWith(github.event.inputs.version, '0') }}
        run: echo PREV=$(git describe --abbrev=0) >> $GITHUB_ENV
      - name: Generate changelog from ${{ env.PREV }}
        continue-on-error: true
        if: ${{ !contains(github.event.inputs.version, '-') }}
        env:
          PREV: ${{ env.PREV }}
        run: |
          git-cliff ${{ env.PREV }}..HEAD --tag v${{ github.event.inputs.version }} --prepend CHANGELOG.md
          if [ -n "$(git status --porcelain)" ]; then
          git commit -am "docs: Update CHANGELOG.md"
          else
            echo "No changes to CHANGELOG.md"
          fi
      - run: yarn install --immutable
        env:
          YARN_ENABLE_SCRIPTS: false
      - name: npm version
        run: |
          npm version ${{ github.event.inputs.version }}
          git push origin ${{ github.ref_name }}
          git push --tags
        env:
          CI: true

  update-main-version:
    needs: build
    if: ${{ github.event.inputs.bump-main == 'true' }}
    runs-on: ubuntu-latest

    steps:
      - name: checkout main branch
        uses: actions/checkout@v4
        with:
          ref: main
          fetch-depth: 0
          token: ${{ secrets.GH_PUSH_TOKEN }}
      - name: setup git config
        run: |
          git config user.name "GitHub Actions Bot"
          git config user.email "<>"
      - name: Use Node js 20
        uses: actions/setup-node@v4
        with:
          node-version: '20.x'
          cache: 'yarn'
      - name: upgrade package version
        run: |
          jq --arg version "${{ github.event.inputs.version }}+main" '.version=$version' package.json > package.json.tmp
          mv package.json.tmp package.json
      - name: checkout changelog from ${{ github.ref_name }}
        run: git checkout origin/${{ github.ref_name }} -- CHANGELOG.md
      - name: lint
        run: |
          yarn install --immutable
          yarn lint:fix
        env:
          YARN_ENABLE_SCRIPTS: false
      - name: push changes
        run: |
          git add package.json CHANGELOG.md
          git commit -m "chore: bump version to ${{ github.event.inputs.version }}+main"
          git push origin main

  publish-docker:
    needs: build
    uses: ./.github/workflows/docker_publish.yaml
    secrets: inherit
    with:
      version: ${{ github.event.inputs.version }}

  publish-npm:
    needs: build
    uses: ./.github/workflows/release.yaml
    secrets: inherit
    with:
      version: ${{ github.event.inputs.version }}

  release-changelog: # TODO this changelog is different than the git-cliff one above
    needs: build
    uses: ./.github/workflows/release_changelog.yml
    with:
      version: ${{ github.event.inputs.version }}

  update-version-checker:
    needs: publish-docker
    if: ${{ github.event.inputs.update-version-function == 'true' }}
    uses: ./.github/workflows/update_version_for_version_checker.yml
    secrets: inherit
    with:
      version: ${{ github.event.inputs.version }}