#!/bin/bash

# Production Deployment Script for Subscription Reminder System
# Usage: ./deploy.sh [environment]

set -e

ENVIRONMENT=${1:-production}
PROJECT_DIR="/var/www/subscriptions.mycloud.mu"
BACKUP_DIR="/var/backups/subscriptions"
LOG_FILE="/var/log/deploy-$(date +%Y%m%d-%H%M%S).log"

echo "🚀 Starting deployment for $ENVIRONMENT environment..."
echo "📋 Logging to: $LOG_FILE"

# Functions
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

backup_database() {
    log "📦 Creating database backup..."
    mkdir -p "$BACKUP_DIR"
    BACKUP_FILE="$BACKUP_DIR/db-backup-$(date +%Y%m%d-%H%M%S).sql"

    if command -v mysqldump &> /dev/null; then
        mysqldump "$(grep DB_DATABASE .env | cut -d '=' -f2)" > "$BACKUP_FILE"
        log "✅ Database backed up to: $BACKUP_FILE"
    else
        log "⚠️  mysqldump not found, skipping database backup"
    fi
}

backup_current() {
    log "📦 Creating application backup..."
    if [ -d "$PROJECT_DIR" ]; then
        tar -czf "$BACKUP_DIR/app-backup-$(date +%Y%m%d-%H%M%S).tar.gz" -C "$(dirname "$PROJECT_DIR")" "$(basename "$PROJECT_DIR")"
        log "✅ Application backed up"
    fi
}

install_dependencies() {
    log "📦 Installing PHP dependencies..."
    composer install --no-dev --optimize-autoloader

    log "📦 Installing Node.js dependencies..."
    npm ci --production

    log "📦 Building assets..."
    npm run build
}

run_migrations() {
    log "🗄️  Running database migrations..."
    php artisan migrate --force

    log "🗄️  Seeding data if needed..."
    php artisan db:seed --force || true
}

optimize_application() {
    log "⚡ Optimizing application..."
    php artisan config:cache
    php artisan route:cache
    php artisan view:cache

    log "🧹 Clearing caches..."
    php artisan cache:clear
    php artisan view:clear
}

set_permissions() {
    log "🔐 Setting proper permissions..."
    chown -R www-data:www-data "$PROJECT_DIR"
    find "$PROJECT_DIR/storage" -type d -exec chmod 755 {} \;
    find "$PROJECT_DIR/storage" -type f -exec chmod 644 {} \;
    find "$PROJECT_DIR/bootstrap/cache" -type d -exec chmod 755 {} \;
}

restart_services() {
    log "🔄 Restarting services..."

    # Reload PHP-FPM
    if systemctl is-active --quiet php8.1-fpm || systemctl is-active --quiet php8.2-fpm || systemctl is-active --quiet php8.3-fpm; then
        if systemctl is-active --quiet php8.3-fpm; then
            systemctl reload php8.3-fpm
        elif systemctl is-active --quiet php8.2-fpm; then
            systemctl reload php8.2-fpm
        elif systemctl is-active --quiet php8.1-fpm; then
            systemctl reload php8.1-fpm
        fi
        log "✅ PHP-FPM reloaded"
    fi

    # Restart queue workers (via supervisor)
    if systemctl is-active --quiet supervisor; then
        supervisorctl restart laravel-worker:* || true
        log "✅ Queue workers restarted"
    fi

    # Restart web server
    if systemctl is-active --quiet nginx; then
        systemctl reload nginx
        log "✅ Nginx reloaded"
    elif systemctl is-active --quiet apache2; then
        systemctl reload apache2
        log "✅ Apache reloaded"
    fi
}

verify_deployment() {
    log "🔍 Verifying deployment..."

    # Check if application is responding
    if curl -f -s "http://localhost" > /dev/null; then
        log "✅ Application is responding"
    else
        log "❌ Application is not responding"
        exit 1
    fi

    # Check database connection
    if php artisan tinker --execute="DB::connection()->getPdo(); echo 'DB OK';" > /dev/null 2>&1; then
        log "✅ Database connection verified"
    else
        log "❌ Database connection failed"
        exit 1
    fi

    # Check queue workers
    if pgrep -f "queue:work" > /dev/null; then
        log "✅ Queue workers are running"
    else
        log "⚠️  Queue workers not found (may be managed by supervisor)"
    fi
}

# Main deployment process
main() {
    log "🏁 Starting deployment process..."

    # Pre-deployment checks
    if [ ! -d "$PROJECT_DIR" ]; then
        log "❌ Project directory does not exist: $PROJECT_DIR"
        exit 1
    fi

    cd "$PROJECT_DIR"

    # Create backups
    backup_database
    backup_current

    # Stop services during deployment
    log "⏹️  Stopping services..."
    supervisorctl stop laravel-worker:* || true

    # Deploy application
    log "📥 Deploying application files..."
    # Note: Files should already be in place via git pull or file copy

    # Install dependencies
    install_dependencies

    # Run migrations
    run_migrations

    # Optimize
    optimize_application

    # Set permissions
    set_permissions

    # Restart services
    restart_services

    # Verify deployment
    verify_deployment

    log "🎉 Deployment completed successfully!"
    log "🌐 Application should be available at: http://your-domain.com"
    log "📊 Admin dashboard: http://your-domain.com/admin"
    log "🔍 Health check: http://your-domain.com/cron/health"
}

# Run deployment
main "$@"
