name: Release and Publish

on:
  push:
    branches: [ master ]
  workflow_dispatch:

jobs:
  check-version:
    runs-on: ubuntu-latest
    outputs:
      version-changed: ${{ steps.check.outputs.changed }}
      new-version: ${{ steps.check.outputs.version }}
      previous-version: ${{ steps.check.outputs.previous-version }}
      
    steps:
    - name: Checkout code
      uses: actions/checkout@v4
      with:
        fetch-depth: 2
        
    - name: Check if version changed
      id: check
      run: |
        CURRENT_VERSION=$(node -p "require('./package.json').version")
        echo "Current version: $CURRENT_VERSION"

        PREVIOUS_VERSION=$(git show HEAD~1:package.json | node -p "JSON.parse(require('fs').readFileSync('/dev/stdin', 'utf8')).version" 2>/dev/null || echo "0.0.0")
        echo "Previous version: $PREVIOUS_VERSION"
        
        if [ "$CURRENT_VERSION" != "$PREVIOUS_VERSION" ]; then
          echo "✅ Version changed from $PREVIOUS_VERSION to $CURRENT_VERSION"
          echo "changed=true" >> $GITHUB_OUTPUT
        else
          echo "❌ Version unchanged ($CURRENT_VERSION)"
          echo "changed=false" >> $GITHUB_OUTPUT
        fi
        
        echo "version=$CURRENT_VERSION" >> $GITHUB_OUTPUT
        echo "previous-version=$PREVIOUS_VERSION" >> $GITHUB_OUTPUT

  release-and-publish:
    needs: check-version
    if: ${{ needs.check-version.outputs.version-changed == 'true' }}
    runs-on: ubuntu-latest
    permissions:
      contents: write
      id-token: write
    
    steps:
    - name: Checkout code
      uses: actions/checkout@v4
      
    - name: Setup Node.js
      uses: actions/setup-node@v4
      with:
        node-version: '20.x'
        registry-url: 'https://registry.npmjs.org'
        cache: 'npm'
        
    - name: Install dependencies
      run: npm ci
      
    - name: Run tests
      run: npm test
      
    - name: Build package
      run: npm run build
      
    - name: Verify package contents
      run: |
        echo "Package contents:"
        npm pack --dry-run
        
    - name: Check NPM authentication and package status
      run: |
        echo "=== NPM Authentication Check ==="
        npm whoami
        echo ""
        echo "=== Package Information ==="
        npm view axios-har-tracker versions --json || echo "Could not fetch versions"
        echo ""
        echo "=== Current Version Check ==="
        CURRENT_VERSION="${{ needs.check-version.outputs.new-version }}"
        if npm view axios-har-tracker@$CURRENT_VERSION > /dev/null 2>&1; then
          echo "❌ Version $CURRENT_VERSION already exists on NPM"
          exit 1
        else
          echo "✅ Version $CURRENT_VERSION is new"
        fi
        echo ""
        echo "=== Package Ownership Check ==="
        npm view axios-har-tracker maintainers
      env:
        NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
        
    - name: Publish to NPM
      run: |
        echo "Publishing version ${{ needs.check-version.outputs.new-version }}..."
        npm publish --provenance --access public
        echo "✅ Successfully published to NPM"
      env:
        NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
        
    - name: Verify NPM publication
      run: |
        echo "Waiting for NPM registry propagation..."
        sleep 10
        npm view axios-har-tracker@${{ needs.check-version.outputs.new-version }}
      env:
        NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
        
    - name: Create package tarball for release
      run: npm pack
        
    - name: Create Git Tag
      run: |
        VERSION="v${{ needs.check-version.outputs.new-version }}"
        git config user.name "github-actions[bot]"
        git config user.email "github-actions[bot]@users.noreply.github.com"
        git tag -a "$VERSION" -m "Release $VERSION"
        git push origin "$VERSION"
        
    - name: Create GitHub Release
      uses: softprops/action-gh-release@v2
      with:
        tag_name: v${{ needs.check-version.outputs.new-version }}
        name: Release v${{ needs.check-version.outputs.new-version }}
        body: |
          ## 🚀 Release v${{ needs.check-version.outputs.new-version }}
          
          ### What's Changed
          - Version bumped from v${{ needs.check-version.outputs.previous-version }} to v${{ needs.check-version.outputs.new-version }}
          
          📦 **NPM Package**: https://www.npmjs.com/package/axios-har-tracker/v/${{ needs.check-version.outputs.new-version }}
          
          **Full Changelog**: https://github.com/${{ github.repository }}/compare/v${{ needs.check-version.outputs.previous-version }}...v${{ needs.check-version.outputs.new-version }}
        draft: false
        prerelease: false
        files: |
          *.tgz
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        
    - name: Create publish summary
      run: |
        echo "## 🎉 Release Complete!" >> $GITHUB_STEP_SUMMARY
        echo "" >> $GITHUB_STEP_SUMMARY
        echo "✅ **NPM Published**: https://www.npmjs.com/package/axios-har-tracker/v/${{ needs.check-version.outputs.new-version }}" >> $GITHUB_STEP_SUMMARY
        echo "✅ **GitHub Release**: ${{ github.server_url }}/${{ github.repository }}/releases/tag/v${{ needs.check-version.outputs.new-version }}" >> $GITHUB_STEP_SUMMARY
        echo "✅ **NPM Registry**: Version ${{ needs.check-version.outputs.new-version }} published successfully" >> $GITHUB_STEP_SUMMARY