name: Generate Semantic Conventions PR

on:
  schedule:
    # Daily at 01:30 (UTC)
    - cron: '30 1 * * *'
  workflow_dispatch:

jobs:
  check-versions:
    runs-on: ubuntu-latest
    outputs:
      latest-version: ${{ steps.check-versions.outputs.latest-version }}
      already-added: ${{ steps.check-versions.outputs.already-added }}
      already-opened: ${{ steps.check-versions.outputs.already-opened }}
    steps:
      - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1

      - id: check-versions
        name: Check versions
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          # version in this repo are prefixed with v
          latest_version=v$(gh release view \
                               --repo open-telemetry/semantic-conventions \
                               --json tagName \
                               --jq .tagName \
                             | sed 's/^v//')

          rc=$(find semconv -name $latest_version | grep .)
          if $rc == 0; then
            already_added=true
          fi

          matches=$(gh pr list \
                        --author opentelemetrybot \
                        --state open \
                        --search "in:title \"Add semantic conventions version $latest_version\"")
          if [ ! -z "$matches" ]
          then
            already_opened=true
          fi

          echo "latest-version=$latest_version" >> $GITHUB_OUTPUT
          echo "already-added=$already_added" >> $GITHUB_OUTPUT
          echo "already-opened=$already_opened" >> $GITHUB_OUTPUT

  update-semantic-conventions:
    permissions:
      contents: write  # for Git to git push
    runs-on: ubuntu-latest
    if: |
      needs.check-versions.outputs.already-added != 'true' &&
      needs.check-versions.outputs.already-opened != 'true'
    needs:
      - check-versions
    steps:
      - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
      - name: Checkout semantic-convention
        uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
        with:
          repository: open-telemetry/semantic-convention
          path: tmp-semantic-conventions

      - name: Update version
        env:
          VERSION: ${{ needs.check-versions.outputs.latest-version }}
        run: |
          make gensemconv SPECPATH=./tmp-semantic-conventions SPECTAG=$VERSION
          git diff

      - name: Use CLA approved github bot
        run: |
          git config user.name opentelemetrybot
          git config user.email 107717825+opentelemetrybot@users.noreply.github.com

      - name: Create pull request against main
        env:
          VERSION: ${{ needs.check-versions.outputs.latest-version }}
          # not using secrets.GITHUB_TOKEN since pull requests from that token do not run workflows
          GH_TOKEN: ${{ secrets.OPENTELEMETRYBOT_GITHUB_TOKEN }}
        run: |
          message="Add semantic conventions version $VERSION"
          body="Add semantic conventions version \`$VERSION\`."
          branch="opentelemetrybot/add-semantic-conventions-${VERSION}"

          git checkout -b $branch
          git add semconv/
          git commit -m "$message"
          git push --set-upstream origin $branch
          url=$(gh pr create --title "$message" \
                             --body "$body" \
                             --base main)

          pull_request_number=${url//*\//}
          
          # see the template for change log entry file at blob/main/.chloggen/TEMPLATE.yaml
          cat > .chloggen/semconv-$VERSION.yaml << EOF
          change_type: enhancement
          component: semconv
          note: Add semantic conventions version $VERSION
          issues: [ $pull_request_number ]
          EOF

          git add .chloggen/semconv-$VERSION.yaml

          git commit -m "Add change log entry"
          git push
