#!/bin/bash

# 🔧 سكريبت الصيانة والإدارة لمنصة كليكين
# Clickain Platform Maintenance & Management Script

# ألوان للنص
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
NC='\033[0m' # No Color

# دوال الطباعة
print_header() {
    echo -e "${PURPLE}================================${NC}"
    echo -e "${PURPLE}$1${NC}"
    echo -e "${PURPLE}================================${NC}"
}

print_status() {
    echo -e "${GREEN}✅ $1${NC}"
}

print_warning() {
    echo -e "${YELLOW}⚠️  $1${NC}"
}

print_error() {
    echo -e "${RED}❌ $1${NC}"
}

print_info() {
    echo -e "${BLUE}ℹ️  $1${NC}"
}

# عرض القائمة الرئيسية
show_menu() {
    clear
    print_header "🔧 أدوات صيانة منصة كليكين"
    echo ""
    echo "اختر العملية المطلوبة:"
    echo ""
    echo "📊 إدارة قاعدة البيانات:"
    echo "  1) عرض حالة الهجرات"
    echo "  2) تشغيل هجرات جديدة"
    echo "  3) التراجع عن آخر هجرة"
    echo "  4) إعادة تعيين قاعدة البيانات"
    echo "  5) إنشاء نسخة احتياطية"
    echo "  6) استعادة نسخة احتياطية"
    echo ""
    echo "👥 إدارة المستخدمين:"
    echo "  7) عرض المستخدمين"
    echo "  8) إنشاء مستخدم مدير"
    echo "  9) تغيير كلمة مرور مستخدم"
    echo "  10) حذف مستخدم"
    echo ""
    echo "🔍 مراقبة النظام:"
    echo "  11) فحص صحة النظام"
    echo "  12) عرض السجلات"
    echo "  13) مراقبة الأداء"
    echo "  14) تنظيف الملفات المؤقتة"
    echo ""
    echo "🚀 إدارة الخادم:"
    echo "  15) تشغيل الخادم"
    echo "  16) إيقاف الخادم"
    echo "  17) إعادة تشغيل الخادم"
    echo "  18) تحديث المكتبات"
    echo ""
    echo "  0) خروج"
    echo ""
    read -p "اختر رقم العملية: " choice
}

# عرض حالة الهجرات
show_migration_status() {
    print_header "📊 حالة هجرات قاعدة البيانات"
    npx knex migrate:status
    echo ""
    read -p "اضغط Enter للمتابعة..."
}

# تشغيل هجرات جديدة
run_migrations() {
    print_header "🔄 تشغيل الهجرات"
    print_info "تشغيل هجرات قاعدة البيانات..."
    
    if npx knex migrate:latest; then
        print_status "تم تشغيل الهجرات بنجاح"
    else
        print_error "فشل في تشغيل الهجرات"
    fi
    
    echo ""
    read -p "اضغط Enter للمتابعة..."
}

# التراجع عن آخر هجرة
rollback_migration() {
    print_header "⏪ التراجع عن الهجرة"
    print_warning "هذا سيتراجع عن آخر هجرة. هل أنت متأكد؟ (y/N)"
    read -p "الإجابة: " confirm
    
    if [[ $confirm == [yY] || $confirm == [yY][eE][sS] ]]; then
        if npx knex migrate:rollback; then
            print_status "تم التراجع عن الهجرة بنجاح"
        else
            print_error "فشل في التراجع عن الهجرة"
        fi
    else
        print_info "تم إلغاء العملية"
    fi
    
    echo ""
    read -p "اضغط Enter للمتابعة..."
}

# إعادة تعيين قاعدة البيانات
reset_database() {
    print_header "🔄 إعادة تعيين قاعدة البيانات"
    print_error "تحذير: هذا سيحذف جميع البيانات!"
    print_warning "هل أنت متأكد من إعادة تعيين قاعدة البيانات؟ (y/N)"
    read -p "الإجابة: " confirm
    
    if [[ $confirm == [yY] || $confirm == [yY][eE][sS] ]]; then
        print_info "إعادة تعيين قاعدة البيانات..."
        
        # التراجع عن جميع الهجرات
        npx knex migrate:rollback --all
        
        # تشغيل الهجرات مرة أخرى
        npx knex migrate:latest
        
        # إدراج البيانات الأولية
        npx knex seed:run
        
        print_status "تم إعادة تعيين قاعدة البيانات بنجاح"
    else
        print_info "تم إلغاء العملية"
    fi
    
    echo ""
    read -p "اضغط Enter للمتابعة..."
}

# إنشاء نسخة احتياطية
create_backup() {
    print_header "💾 إنشاء نسخة احتياطية"
    
    # إنشاء مجلد النسخ الاحتياطية
    mkdir -p backups
    
    # اسم الملف مع التاريخ والوقت
    BACKUP_FILE="backups/clickain_backup_$(date +%Y%m%d_%H%M%S).sql"
    
    print_info "إنشاء نسخة احتياطية..."
    
    # قراءة معلومات قاعدة البيانات من .env
    if [ -f ".env" ]; then
        DB_HOST=$(grep DB_HOST .env | cut -d '=' -f2)
        DB_NAME=$(grep DB_NAME .env | cut -d '=' -f2)
        DB_USER=$(grep DB_USER .env | cut -d '=' -f2)
        DB_PASSWORD=$(grep DB_PASSWORD .env | cut -d '=' -f2)
        
        # إزالة المسافات والاقتباسات
        DB_HOST=$(echo $DB_HOST | tr -d ' "'"'"'')
        DB_NAME=$(echo $DB_NAME | tr -d ' "'"'"'')
        DB_USER=$(echo $DB_USER | tr -d ' "'"'"'')
        DB_PASSWORD=$(echo $DB_PASSWORD | tr -d ' "'"'"'')
        
        if command -v mysqldump &> /dev/null; then
            if mysqldump -h "$DB_HOST" -u "$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" > "$BACKUP_FILE"; then
                print_status "تم إنشاء النسخة الاحتياطية: $BACKUP_FILE"
            else
                print_error "فشل في إنشاء النسخة الاحتياطية"
            fi
        else
            print_error "mysqldump غير مثبت"
        fi
    else
        print_error "ملف .env غير موجود"
    fi
    
    echo ""
    read -p "اضغط Enter للمتابعة..."
}

# عرض المستخدمين
show_users() {
    print_header "👥 قائمة المستخدمين"
    
    # استخدام node لتشغيل استعلام
    node -e "
    const db = require('./src/config/database');
    
    db('users')
        .select('id', 'email', 'first_name', 'last_name', 'role', 'status', 'created_at')
        .whereNull('deleted_at')
        .then(users => {
            console.log('ID | البريد الإلكتروني | الاسم | الدور | الحالة | تاريخ الإنشاء');
            console.log('---|---|---|---|---|---');
            users.forEach(user => {
                console.log(\`\${user.id} | \${user.email} | \${user.first_name} \${user.last_name} | \${user.role} | \${user.status} | \${user.created_at}\`);
            });
            process.exit(0);
        })
        .catch(err => {
            console.error('خطأ:', err.message);
            process.exit(1);
        });
    "
    
    echo ""
    read -p "اضغط Enter للمتابعة..."
}

# فحص صحة النظام
health_check() {
    print_header "🔍 فحص صحة النظام"
    
    print_info "فحص اتصال قاعدة البيانات..."
    if npx knex migrate:status &> /dev/null; then
        print_status "قاعدة البيانات متصلة"
    else
        print_error "مشكلة في اتصال قاعدة البيانات"
    fi
    
    print_info "فحص الملفات المطلوبة..."
    required_files=("package.json" "server.js" ".env")
    for file in "${required_files[@]}"; do
        if [ -f "$file" ]; then
            print_status "$file موجود"
        else
            print_error "$file مفقود"
        fi
    done
    
    print_info "فحص المجلدات المطلوبة..."
    required_dirs=("src" "database" "public")
    for dir in "${required_dirs[@]}"; do
        if [ -d "$dir" ]; then
            print_status "$dir موجود"
        else
            print_error "$dir مفقود"
        fi
    done
    
    print_info "فحص المكتبات..."
    if [ -d "node_modules" ]; then
        print_status "المكتبات مثبتة"
    else
        print_error "المكتبات غير مثبتة - قم بتشغيل: npm install"
    fi
    
    echo ""
    read -p "اضغط Enter للمتابعة..."
}

# عرض السجلات
show_logs() {
    print_header "📋 سجلات النظام"
    
    if [ -f "logs/app.log" ]; then
        print_info "آخر 50 سطر من السجلات:"
        echo ""
        tail -n 50 logs/app.log
    else
        print_warning "ملف السجلات غير موجود"
    fi
    
    echo ""
    read -p "اضغط Enter للمتابعة..."
}

# تنظيف الملفات المؤقتة
cleanup_temp_files() {
    print_header "🧹 تنظيف الملفات المؤقتة"
    
    print_info "تنظيف ملفات npm..."
    npm cache clean --force
    
    print_info "تنظيف السجلات القديمة..."
    if [ -f "logs/app.log" ]; then
        # الاحتفاظ بآخر 1000 سطر فقط
        tail -n 1000 logs/app.log > logs/app.log.tmp
        mv logs/app.log.tmp logs/app.log
        print_status "تم تنظيف السجلات"
    fi
    
    print_info "تنظيف الملفات المؤقتة..."
    find . -name "*.tmp" -delete
    find . -name ".DS_Store" -delete
    
    print_status "تم تنظيف الملفات المؤقتة"
    
    echo ""
    read -p "اضغط Enter للمتابعة..."
}

# تشغيل الخادم
start_server() {
    print_header "🚀 تشغيل الخادم"
    
    print_info "تشغيل خادم كليكين..."
    print_info "للإيقاف اضغط Ctrl+C"
    echo ""
    
    npm run dev
}

# تحديث المكتبات
update_dependencies() {
    print_header "📦 تحديث المكتبات"
    
    print_info "فحص التحديثات المتاحة..."
    npm outdated
    
    echo ""
    print_warning "هل تريد تحديث المكتبات؟ (y/N)"
    read -p "الإجابة: " confirm
    
    if [[ $confirm == [yY] || $confirm == [yY][eE][sS] ]]; then
        print_info "تحديث المكتبات..."
        npm update
        
        print_info "فحص الثغرات الأمنية..."
        npm audit
        
        print_status "تم تحديث المكتبات"
    else
        print_info "تم إلغاء التحديث"
    fi
    
    echo ""
    read -p "اضغط Enter للمتابعة..."
}

# الحلقة الرئيسية
main_loop() {
    while true; do
        show_menu
        
        case $choice in
            1) show_migration_status ;;
            2) run_migrations ;;
            3) rollback_migration ;;
            4) reset_database ;;
            5) create_backup ;;
            6) print_info "استعادة النسخة الاحتياطية - قريباً" ;;
            7) show_users ;;
            8) print_info "إنشاء مستخدم مدير - قريباً" ;;
            9) print_info "تغيير كلمة المرور - قريباً" ;;
            10) print_info "حذف مستخدم - قريباً" ;;
            11) health_check ;;
            12) show_logs ;;
            13) print_info "مراقبة الأداء - قريباً" ;;
            14) cleanup_temp_files ;;
            15) start_server ;;
            16) print_info "إيقاف الخادم - استخدم Ctrl+C" ;;
            17) print_info "إعادة تشغيل الخادم - قريباً" ;;
            18) update_dependencies ;;
            0) 
                print_info "شكراً لاستخدام أدوات صيانة كليكين!"
                exit 0
                ;;
            *)
                print_error "خيار غير صحيح"
                sleep 2
                ;;
        esac
    done
}

# تشغيل البرنامج
main_loop