#!/bin/bash

set -e  # Exit on any error

echo "========================================="
echo "  Hunto Node SDK Deployment Script"
echo "========================================="
echo ""

# Navigate to the script's directory
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"

# Step 1: Regenerate SDK from latest OpenAPI spec
echo "📥 Step 1: Downloading latest OpenAPI spec..."
cd dev
FILE="../openapi.json"
wget https://in.hunto.ai/api/openapi/openapi.json -O $FILE

# Define the tags to exclude
exclude_tags=(
  "sorcerer"
)

# Check if jq is installed
if ! command -v jq &> /dev/null; then
    echo "❌ Error: jq is required but not installed."
    echo "   Install it with: sudo apt install jq"
    exit 1
fi

echo "🔧 Step 2: Filtering OpenAPI spec..."
excluded_tags_json=$(printf '%s\n' "${exclude_tags[@]}" | jq -R . | jq -s .)

jq --argjson excluded_tags "$excluded_tags_json" '
  .paths = (
    .paths |
    with_entries(select(.key | startswith("/monitor") or startswith("/sys") or startswith("/groups")))
  ) |
  .paths = (
    .paths |
    with_entries(
      .value |= (
        with_entries(
          select(
            .value.tags | any(IN($excluded_tags[])) | not
          )
        )
      )
    )
  )
' "$FILE" > temp.json && mv temp.json "$FILE"

# Step 3: Generate SDK
OUTPUT_DIR="../src/sdk"

if [ -d "$OUTPUT_DIR" ]; then
    echo "🗑️  Step 3: Removing existing SDK..."
    rm -rf "$OUTPUT_DIR"
fi

echo "⚙️  Step 4: Generating TypeScript SDK..."
npx openapi-typescript-codegen --input ../openapi.json --client axios --name HuntoClient --output "$OUTPUT_DIR"

cd ..

# Step 5: Format code
echo "✨ Step 5: Formatting generated code..."
npm run format src/

# Step 6: Update package.json version
echo "📦 Step 6: Bumping package version..."
CURRENT_VERSION=$(node -p "require('./package.json').version")
echo "   Current version: $CURRENT_VERSION"

# Ask user for version bump type
echo ""
echo "Select version bump type:"
echo "  1) patch (1.0.7 → 1.0.8)"
echo "  2) minor (1.0.7 → 1.1.0)"
echo "  3) major (1.0.7 → 2.0.0)"
echo "  4) custom"
echo ""
read -p "Enter choice [1-4] (default: 1): " VERSION_CHOICE

VERSION_CHOICE=${VERSION_CHOICE:-1}

case $VERSION_CHOICE in
  1)
    npm version patch --no-git-tag-version
    ;;
  2)
    npm version minor --no-git-tag-version
    ;;
  3)
    npm version major --no-git-tag-version
    ;;
  4)
    read -p "Enter custom version (e.g., 1.2.3): " CUSTOM_VERSION
    npm version $CUSTOM_VERSION --no-git-tag-version
    ;;
  *)
    echo "Invalid choice. Using patch."
    npm version patch --no-git-tag-version
    ;;
esac

NEW_VERSION=$(node -p "require('./package.json').version")
echo "   New version: $NEW_VERSION"

# Step 7: Build TypeScript
echo "🔨 Step 7: Building TypeScript..."
npm run build

# Step 8: Check npm login status
echo "🔐 Step 8: Checking npm authentication..."
if ! npm whoami &> /dev/null; then
    echo "⚠️  Not logged in to npm. Please log in:"
    npm login
else
    NPM_USER=$(npm whoami)
    echo "   ✓ Logged in as: $NPM_USER"
fi

# Step 9: Publish to npm
echo ""
echo "🚀 Step 9: Publishing to npm..."
read -p "Ready to publish hunto-node-sdk@$NEW_VERSION? [y/N]: " CONFIRM

if [[ $CONFIRM =~ ^[Yy]$ ]]; then
    npm publish
    echo ""
    echo "========================================="
    echo "✅ Successfully published!"
    echo "   Package: hunto-node-sdk@$NEW_VERSION"
    echo "   URL: https://www.npmjs.com/package/hunto-node-sdk"
    echo "========================================="
else
    echo "❌ Publish cancelled."
    exit 1
fi

echo ""
echo "📝 Next steps:"
echo "   1. Update consumers: npm install hunto-node-sdk@$NEW_VERSION"
echo "   2. Test the new version in your projects"
echo "   3. Commit changes: git add . && git commit -m 'chore: update SDK to v$NEW_VERSION'"
echo ""
