name: CI for OPNET

on:
  push:
    tags:
      - 'v*'

jobs:
  publish:
    runs-on: ubuntu-latest

    permissions:
      contents: write
      id-token: write

    steps:
      - name: Checkout code
        uses: actions/checkout@v6
        with:
          fetch-depth: 0

      - name: Setup Node.js
        uses: actions/setup-node@v6
        with:
          node-version: '24.x'
          registry-url: 'https://registry.npmjs.org'

      - name: Update npm
        run: npm install -g npm@latest

      - name: Install dependencies
        run: npm install

      - name: Build the project
        run: npm run build

      - name: Build browser assets
        run: npm run browserBuild

      - name: Determine npm tag
        id: npm_tag
        run: |
          VERSION="${{ github.ref_name }}"
          if [[ "$VERSION" == *"-alpha"* ]]; then
            echo "tag=alpha" >> $GITHUB_OUTPUT
          elif [[ "$VERSION" == *"-beta"* ]]; then
            echo "tag=beta" >> $GITHUB_OUTPUT
          elif [[ "$VERSION" == *"-rc"* ]]; then
            echo "tag=rc" >> $GITHUB_OUTPUT
          else
            echo "tag=latest" >> $GITHUB_OUTPUT
          fi
          echo "Determined npm tag: $(cat $GITHUB_OUTPUT | grep tag | cut -d= -f2)"

      - name: Publish to npm
        run: npm publish --access public --tag ${{ steps.npm_tag.outputs.tag }}
        env:
          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

  release:
    runs-on: ubuntu-latest
    needs: publish

    permissions:
      contents: write

    steps:
      - name: Checkout code
        uses: actions/checkout@v6
        with:
          fetch-depth: 0

      - name: Determine if prerelease
        id: prerelease
        run: |
          VERSION="${{ github.ref_name }}"
          if [[ "$VERSION" == *"-alpha"* ]] || [[ "$VERSION" == *"-beta"* ]] || [[ "$VERSION" == *"-rc"* ]]; then
            echo "is_prerelease=true" >> $GITHUB_OUTPUT
          else
            echo "is_prerelease=false" >> $GITHUB_OUTPUT
          fi

      - name: Generate changelog
        id: changelog
        uses: mikepenz/release-changelog-builder-action@v6
        with:
          ignorePreReleases: ${{ steps.prerelease.outputs.is_prerelease == 'false' }}
          configurationJson: |
            {
              "categories": [
                {
                  "title": "### Breaking Changes",
                  "labels": ["breaking", "breaking-change", "BREAKING-CHANGE"]
                },
                {
                  "title": "### Features",
                  "labels": ["feature", "feat", "enhancement"]
                },
                {
                  "title": "### Bug Fixes",
                  "labels": ["bug", "fix", "bugfix"]
                },
                {
                  "title": "### Performance",
                  "labels": ["performance", "perf"]
                },
                {
                  "title": "### Documentation",
                  "labels": ["documentation", "docs"]
                },
                {
                  "title": "### Dependencies",
                  "labels": ["dependencies", "deps"]
                },
                {
                  "title": "### Other Changes",
                  "labels": []
                }
              ],
              "sort": {
                "order": "ASC",
                "on_property": "mergedAt"
              },
              "template": "#{{CHANGELOG}}",
              "pr_template": "- #{{TITLE}} ([##{{NUMBER}}](#{{URL}})) by @#{{AUTHOR}}",
              "empty_template": "- No changes",
              "max_tags_to_fetch": 200,
              "max_pull_requests": 200,
              "max_back_track_time_days": 365,
              "tag_resolver": {
                "method": "semver"
              }
            }
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Update CHANGELOG.md
        env:
          CHANGELOG_CONTENT: ${{ steps.changelog.outputs.changelog }}
        run: |
          TAG="${{ github.ref_name }}"
          DATE=$(date +%Y-%m-%d)
          NEW_HEADER="## [$TAG] - $DATE"

          # Write changelog content to temp file using env var (avoids shell escaping)
          printf '%s\n' "$CHANGELOG_CONTENT" > /tmp/new_entry.md

          if [ -f CHANGELOG.md ]; then
            # Create new file with entry inserted after header line
            {
              head -n 1 CHANGELOG.md
              echo ""
              echo "$NEW_HEADER"
              echo ""
              cat /tmp/new_entry.md
              echo ""
              tail -n +2 CHANGELOG.md
            } > /tmp/CHANGELOG_NEW.md
            mv /tmp/CHANGELOG_NEW.md CHANGELOG.md
          else
            # Create new CHANGELOG.md
            {
              echo "# Changelog"
              echo ""
              echo "All notable changes to this project will be documented in this file."
              echo ""
              echo "This changelog is automatically generated from merged pull requests."
              echo ""
              echo "$NEW_HEADER"
              echo ""
              cat /tmp/new_entry.md
            } > CHANGELOG.md
          fi

          rm -f /tmp/new_entry.md

      - name: Commit changelog
        run: |
          git config user.name "github-actions[bot]"
          git config user.email "github-actions[bot]@users.noreply.github.com"
          git add CHANGELOG.md
          git diff --staged --quiet || git commit -m "docs: update CHANGELOG.md for ${{ github.ref_name }}"
          git push origin HEAD:main || echo "No changes to push or push failed"

      - name: Create GitHub Release
        uses: softprops/action-gh-release@v2
        with:
          tag_name: ${{ github.ref_name }}
          name: Release ${{ github.ref_name }}
          body: ${{ steps.changelog.outputs.changelog }}
          prerelease: ${{ steps.prerelease.outputs.is_prerelease == 'true' }}
          generate_release_notes: false
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
