name: Deploy to Cloudflare Pages

on:
  push:
    branches:
      - main
  workflow_dispatch:

env:
  OAUTH_DIR: oauth
  KEEP_DEPLOYMENTS: 5

jobs:
  deploy:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      deployments: write
    
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '21'

      - name: Install dependencies
        run: |
          cd ${{ env.OAUTH_DIR }}
          npm install

      - name: Build OAuth app
        run: |
          cd ${{ env.OAUTH_DIR }}
          NODE_ENV=production npm run build
      - name: Copy OAuth build to static
        run: |
          rm -rf my-blog/static/assets
          cp -rf ${{ env.OAUTH_DIR }}/dist/* my-blog/static/
          cp ${{ env.OAUTH_DIR }}/dist/index.html my-blog/templates/oauth-assets.html
          
      - name: Cache ailog binary
        uses: actions/cache@v4
        with:
          path: ./bin
          key: ailog-bin-${{ runner.os }}
          restore-keys: |
            ailog-bin-${{ runner.os }}
            
      - name: Setup ailog binary
        run: |
          # Get expected version from Cargo.toml
          EXPECTED_VERSION=$(grep '^version' Cargo.toml | cut -d'"' -f2)
          echo "Expected version from Cargo.toml: $EXPECTED_VERSION"
          
          # Check current binary version if exists
          if [ -f "./bin/ailog" ]; then
            CURRENT_VERSION=$(./bin/ailog --version 2>/dev/null || echo "unknown")
            echo "Current binary version: $CURRENT_VERSION"
          else
            CURRENT_VERSION="none"
            echo "No binary found"
          fi
          
          # Check OS
          OS="${{ runner.os }}"
          echo "Runner OS: $OS"
          
          # Use pre-packaged binary if version matches or extract from tar.gz
          if [ "$CURRENT_VERSION" = "$EXPECTED_VERSION" ]; then
            echo "Binary is up to date"
            chmod +x ./bin/ailog
          elif [ "$OS" = "Linux" ] && [ -f "./bin/ailog-linux-x86_64.tar.gz" ]; then
            echo "Extracting ailog from pre-packaged tar.gz..."
            cd bin
            tar -xzf ailog-linux-x86_64.tar.gz
            chmod +x ailog
            cd ..
            
            # Verify extracted version
            EXTRACTED_VERSION=$(./bin/ailog --version 2>/dev/null || echo "unknown")
            echo "Extracted binary version: $EXTRACTED_VERSION"
            
            if [ "$EXTRACTED_VERSION" != "$EXPECTED_VERSION" ]; then
              echo "Warning: Binary version mismatch. Expected $EXPECTED_VERSION but got $EXTRACTED_VERSION"
            fi
          else
            echo "Error: No suitable binary found for OS: $OS"
            exit 1
          fi

      - name: Build site with ailog
        run: |
          cd my-blog
          ../bin/ailog build

      - name: List public directory
        run: |
          ls -la my-blog/public/
          
      - name: Deploy to Cloudflare Pages
        uses: cloudflare/pages-action@v1
        with:
          apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
          accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
          projectName: ${{ secrets.CLOUDFLARE_PROJECT_NAME }}
          directory: my-blog/public
          gitHubToken: ${{ secrets.GITHUB_TOKEN }}
          wranglerVersion: '3'

#  cleanup:
#    needs: deploy
#    runs-on: ubuntu-latest
#    if: success()
#    steps:
#      - name: Cleanup old deployments
#        run: |
#          curl -X PATCH \
#            "https://api.cloudflare.com/client/v4/accounts/${{ secrets.CLOUDFLARE_ACCOUNT_ID }}/pages/projects/${{ secrets.CLOUDFLARE_PROJECT_NAME }} \
#            -H "Authorization: Bearer ${{ secrets.CLOUDFLARE_API_TOKEN }}" \
#            -H "Content-Type: application/json")
#            -d "{ \"deployment_configs\": { \"production\": { \"deployment_retention\": ${{ env.KEEP_DEPLOYMENTS }} } } }"
#          # Get all deployments
#          DEPLOYMENTS=$(curl -s -X GET \
#            "https://api.cloudflare.com/client/v4/accounts/${{ secrets.CLOUDFLARE_ACCOUNT_ID }}/pages/projects/${{ secrets.CLOUDFLARE_PROJECT_NAME }}/deployments" \
#            -H "Authorization: Bearer ${{ secrets.CLOUDFLARE_API_TOKEN }}" \
#            -H "Content-Type: application/json")
#          
#          # Extract deployment IDs (skip the latest N deployments)
#          DEPLOYMENT_IDS=$(echo "$DEPLOYMENTS" | jq -r ".result | sort_by(.created_on) | reverse | .[${{ env.KEEP_DEPLOYMENTS }}:] | .[].id // empty")
#          
#          if [ -z "$DEPLOYMENT_IDS" ]; then
#            echo "No old deployments to delete"
#            exit 0
#          fi
#          
#          # Delete old deployments
#          for ID in $DEPLOYMENT_IDS; do
#            echo "Deleting deployment: $ID"
#            RESPONSE=$(curl -s -X DELETE \
#              "https://api.cloudflare.com/client/v4/accounts/${{ secrets.CLOUDFLARE_ACCOUNT_ID }}/pages/projects/${{ secrets.CLOUDFLARE_PROJECT_NAME }}/deployments/$ID" \
#              -H "Authorization: Bearer ${{ secrets.CLOUDFLARE_API_TOKEN }}" \
#              -H "Content-Type: application/json")
#            
#            SUCCESS=$(echo "$RESPONSE" | jq -r '.success')
#            if [ "$SUCCESS" = "true" ]; then
#              echo "Successfully deleted deployment: $ID"
#            else
#              echo "Failed to delete deployment: $ID"
#              echo "$RESPONSE" | jq .
#            fi
#            
#            sleep 1  # Rate limiting
#          done
#          
#          echo "Cleanup completed!"