name: Release

on:
  release:
    types: [ published ]

permissions:
  contents: write
  packages: write

jobs:
  publish:
    name: Publish to NPM
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        with:
          ref: main
          token: ${{ secrets.GITHUB_TOKEN }}
          fetch-depth: 0

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20.x'
          cache: 'npm'
          registry-url: 'https://registry.npmjs.org'

      - name: Install dependencies
        run: npm ci

      - name: Run tests before publishing
        run: npm test

      - name: Run linting before publishing
        run: npm run lint

      - name: Check formatting before publishing
        run: npm run format:check

      - name: Verify package.json
        run: |
          echo "📦 Package details:"
          echo "  Name: $(npm pkg get name)"
          echo "  Version: $(npm pkg get version)"
          echo "  Description: $(npm pkg get description)"
          echo "  Main: $(npm pkg get main)"
          echo "  Bin: $(npm pkg get bin)"
          echo "  Files: $(npm pkg get files)"
          echo "  Repository: $(npm pkg get repository)"

      - name: Test CLI functionality
        run: |
          echo "🧪 Testing CLI functionality..."
          npm start -- --help
          npm start -- --version
          echo "✅ CLI tests passed"

      - name: Publish to NPM
        run: |
          echo "📦 Publishing to NPM..."

          # Get the version from the release tag
          # GITHUB_REF format: refs/tags/v2.3.0
          VERSION=${GITHUB_REF##*/}  # Remove everything up to the last /
          VERSION=${VERSION#v}       # Remove the 'v' prefix if present
          echo "📋 Publishing version: $VERSION"
          echo "📋 Original GITHUB_REF: $GITHUB_REF"

          # Check if version update is needed
          CURRENT_VERSION=$(npm pkg get version | tr -d '"')
          echo "📋 Current package.json version: $CURRENT_VERSION"

          if [ "$CURRENT_VERSION" != "$VERSION" ]; then
            echo "📋 Updating version from $CURRENT_VERSION to $VERSION"
            npm version $VERSION --no-git-tag-version
          else
            echo "📋 Version $VERSION already set in package.json - skipping version update"
          fi

          # Publish to NPM
          npm publish --access public

          echo "✅ Successfully published to NPM!"
        env:
          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

      - name: Verify NPM publication
        run: |
          echo "🔍 Verifying NPM publication..."
          PACKAGE_NAME=$(npm pkg get name | tr -d '"')
          VERSION=${GITHUB_REF##*/}  # Remove everything up to the last /
          VERSION=${VERSION#v}       # Remove the 'v' prefix if present
          echo "📦 Published: $PACKAGE_NAME@$VERSION"
          echo "🌐 NPM URL: https://www.npmjs.com/package/$PACKAGE_NAME"

          # Wait a moment for NPM to process
          sleep 10

          # Verify the package exists on NPM
          if npm view "$PACKAGE_NAME@$VERSION" version > /dev/null 2>&1; then
            echo "✅ Package successfully published to NPM!"
            echo "📋 Package info:"
            npm view "$PACKAGE_NAME@$VERSION"
          else
            echo "❌ Package not found on NPM. This might be a timing issue."
            echo "🔍 Checking latest version..."
            npm view "$PACKAGE_NAME" version || echo "Package not yet available"
          fi

      - name: Create release summary
        run: |
          PACKAGE_NAME=$(npm pkg get name | tr -d '"')
          VERSION=${GITHUB_REF##*/}  # Remove everything up to the last /
          VERSION=${VERSION#v}       # Remove the 'v' prefix if present
          echo "## 🎉 Release Summary" >> $GITHUB_STEP_SUMMARY
          echo "" >> $GITHUB_STEP_SUMMARY
          echo "**Package:** \`$PACKAGE_NAME@$VERSION\`" >> $GITHUB_STEP_SUMMARY
          echo "" >> $GITHUB_STEP_SUMMARY
          echo "**NPM URL:** https://www.npmjs.com/package/$PACKAGE_NAME" >> $GITHUB_STEP_SUMMARY
          echo "" >> $GITHUB_STEP_SUMMARY
          echo "**Installation:**" >> $GITHUB_STEP_SUMMARY
          echo "\`\`\`bash" >> $GITHUB_STEP_SUMMARY
          echo "npm install -g $PACKAGE_NAME" >> $GITHUB_STEP_SUMMARY
          echo "# or" >> $GITHUB_STEP_SUMMARY
          echo "npx $PACKAGE_NAME" >> $GITHUB_STEP_SUMMARY
          echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
          echo "" >> $GITHUB_STEP_SUMMARY
          echo "✅ All tests passed" >> $GITHUB_STEP_SUMMARY
          echo "✅ Linting passed" >> $GITHUB_STEP_SUMMARY
          echo "✅ Formatting passed" >> $GITHUB_STEP_SUMMARY
          echo "✅ Package published to NPM" >> $GITHUB_STEP_SUMMARY
