#!/bin/bash
# ============================================
# WhatsApp Gateway - Zero-Downtime Deployment Script
# ============================================
#
# Fitur:
# - Auto-reconnect session tanpa scan ulang
# - Zero-downtime deployment (PM2 reload)
# - Backup sebelum deploy
# - Rollback jika error
#
# Penggunaan:
#   ./deploy.sh              # Deploy ke production
#   ./deploy.sh rollback     # Rollback ke versi sebelumnya
#

set -e  # Exit on error

# ============================================
# CONFIGURATION
# ============================================
PROJECT_DIR="/workspace/baileys/whatsapp-rest-api-laravel"
NODEJS_DIR="$PROJECT_DIR/nodejs-server"
SESSIONS_DIR="/var/lib/whatsapp-sessions"  # Persistent sessions
BACKUP_DIR="$PROJECT_DIR/backups"
PM2_APP_NAME="baileys"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)

# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# ============================================
# FUNCTIONS
# ============================================

log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# ============================================
# PRE-DEPLOYMENT CHECKS
# ============================================

# Cek apakah sessions directory ada
if [ ! -d "$SESSIONS_DIR" ]; then
    log_warn "Sessions directory not found: $SESSIONS_DIR"
    log_info "Creating sessions directory..."
    sudo mkdir -p "$SESSIONS_DIR"
    sudo chown $USER:$USER "$SESSIONS_DIR"
    log_info "Sessions directory created: $SESSIONS_DIR"
fi

# Cek apakah ada sessions yang aktif
SESSION_COUNT=$(find "$SESSIONS_DIR" -name "creds.json" 2>/dev/null | wc -l)
log_info "Found $SESSION_COUNT active session(s) in $SESSIONS_DIR"

# ============================================
# ROLLBACK FUNCTION
# ============================================

if [ "$1" == "rollback" ]; then
    log_info "Rolling back to previous version..."

    if [ ! -d "$BACKUP_DIR" ]; then
        log_error "No backup directory found!"
        exit 1
    fi

    # Cari backup terbaru
    LATEST_BACKUP=$(ls -t "$BACKUP_DIR" | head -1)

    if [ -z "$LATEST_BACKUP" ]; then
        log_error "No backup found!"
        exit 1
    fi

    log_info "Restoring from backup: $LATEST_BACKUP"

    # Restore backup
    cp -r "$BACKUP_DIR/$LATEST_BACKUP/dist" "$NODEJS_DIR/"

    # Restart PM2
    pm2 restart "$PM2_APP_NAME"

    log_info "Rollback completed!"
    exit 0
fi

# ============================================
# BACKUP CURRENT VERSION
# ============================================

log_info "=========================================="
log_info "Starting deployment process..."
log_info "=========================================="

log_info "Creating backup of current version..."
mkdir -p "$BACKUP_DIR"

if [ -d "$NODEJS_DIR/dist" ]; then
    cp -r "$NODEJS_DIR/dist" "$BACKUP_DIR/dist_$TIMESTAMP"
    log_info "Backup created: $BACKUP_DIR/dist_$TIMESTAMP"
fi

# ============================================
# BUILD PROCESS
# ============================================

cd "$NODEJS_DIR"

log_info "Installing dependencies..."
npm ci --production=false

log_info "Building project..."
npm run build

# ============================================
# VERIFY BUILD
# ============================================

if [ ! -d "$NODEJS_DIR/dist" ]; then
    log_error "Build failed - dist directory not found!"
    log_info "Rolling back..."
    cp -r "$BACKUP_DIR/dist_$TIMESTAMP" "$NODEJS_DIR/dist"
    exit 1
fi

log_info "Build completed successfully!"

# ============================================
# ENVIRONMENT SETUP
# ============================================

log_info "Setting up environment..."

# Pastikan SESSIONS_DIR di-set di .env atau PM2 config
if ! grep -q "SESSIONS_DIR" "$NODEJS_DIR/.env" 2>/dev/null; then
    log_warn "SESSIONS_DIR not found in .env, adding..."
    echo "SESSIONS_DIR=$SESSIONS_DIR" >> "$NODEJS_DIR/.env"
fi

# ============================================
# DEPLOYMENT STRATEGY
# ============================================

log_info "=========================================="
log_info "Deployment Options:"
log_info "=========================================="
log_info "1. PM2 Reload (Zero-Downtime - RECOMMENDED)"
log_info "2. PM2 Restart (Brief Downtime)"
log_info ""
read -p "Choose deployment strategy (1 or 2): " strategy

case $strategy in
    1)
        log_info "Using PM2 Reload (Zero-Downtime)..."

        # PM2 reload akan:
        # 1. Spawn new process
        # 2. Wait for new process to be ready
        # 3. Gracefully shutdown old process
        # 4. Sessions akan auto-reconnect di new process
        pm2 reload "$PM2_APP_NAME" --update-env

        log_info "Zero-downtime deployment completed!"
        ;;
    2)
        log_info "Using PM2 Restart (Brief Downtime)..."

        # Stop
        pm2 stop "$PM2_APP_NAME"

        # Start
        pm2 start "$PM2_APP_NAME" --update-env

        log_info "Deployment completed!"
        ;;
    *)
        log_error "Invalid choice!"
        exit 1
        ;;
esac

# ============================================
# POST-DEPLOYMENT VERIFICATION
# ============================================

log_info "Waiting for services to start..."
sleep 5

# Cek status PM2
pm2 status "$PM2_APP_NAME"

# Cek apakah sessions reconnect
NEW_SESSION_COUNT=$(find "$SESSIONS_DIR" -name "creds.json" 2>/dev/null | wc -l)
log_info "Active sessions after deploy: $NEW_SESSION_COUNT"

if [ $NEW_SESSION_COUNT -lt $SESSION_COUNT ]; then
    log_warn "Warning: Some sessions may not have reconnected!"
    log_warn "Before: $SESSION_COUNT, After: $NEW_SESSION_COUNT"
else
    log_info "All sessions reconnected successfully!"
fi

# ============================================
# CLEANUP OLD BACKUPS
# ============================================

log_info "Cleaning up old backups (keeping last 5)..."
cd "$BACKUP_DIR"
ls -t | tail -n +6 | xargs -r rm -rf

log_info "=========================================="
log_info "Deployment completed successfully!"
log_info "=========================================="
