#!/bin/bash

# 🚀 سكريبت الإعداد التلقائي لمنصة كليكين
# Clickain Platform Automatic Setup Script

echo "🚀 مرحباً بك في سكريبت إعداد منصة كليكين"
echo "Welcome to Clickain Platform Setup Script"
echo "=========================================="

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

# دالة لطباعة رسائل ملونة
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}"
}

# التحقق من Node.js
check_nodejs() {
    print_info "التحقق من تثبيت Node.js..."
    if command -v node &> /dev/null; then
        NODE_VERSION=$(node --version)
        print_status "Node.js مثبت - الإصدار: $NODE_VERSION"
        
        # التحقق من الإصدار
        NODE_MAJOR_VERSION=$(node --version | cut -d'.' -f1 | sed 's/v//')
        if [ "$NODE_MAJOR_VERSION" -lt 16 ]; then
            print_warning "يُنصح بترقية Node.js إلى الإصدار 16 أو أحدث"
        fi
    else
        print_error "Node.js غير مثبت!"
        print_info "يرجى تحميل وتثبيت Node.js من: https://nodejs.org"
        exit 1
    fi
}

# التحقق من npm
check_npm() {
    print_info "التحقق من npm..."
    if command -v npm &> /dev/null; then
        NPM_VERSION=$(npm --version)
        print_status "npm مثبت - الإصدار: $NPM_VERSION"
    else
        print_error "npm غير مثبت!"
        exit 1
    fi
}

# التحقق من ملفات المشروع
check_project_files() {
    print_info "التحقق من ملفات المشروع..."
    
    required_files=("package.json" "server.js" "knexfile.js" ".env.example")
    missing_files=()
    
    for file in "${required_files[@]}"; do
        if [ ! -f "$file" ]; then
            missing_files+=("$file")
        fi
    done
    
    if [ ${#missing_files[@]} -eq 0 ]; then
        print_status "جميع الملفات المطلوبة موجودة"
    else
        print_error "الملفات التالية مفقودة:"
        for file in "${missing_files[@]}"; do
            echo "  - $file"
        done
        exit 1
    fi
}

# إنشاء ملف .env
setup_env_file() {
    print_info "إعداد ملف البيئة (.env)..."
    
    if [ ! -f ".env" ]; then
        cp .env.example .env
        print_status "تم إنشاء ملف .env من المثال"
        print_warning "يرجى تحديث معلومات قاعدة البيانات في ملف .env"
        
        # فتح ملف .env للتحرير
        if command -v code &> /dev/null; then
            print_info "فتح ملف .env في VS Code..."
            code .env
        elif command -v nano &> /dev/null; then
            print_info "يمكنك تحرير ملف .env باستخدام: nano .env"
        else
            print_info "يمكنك تحرير ملف .env باستخدام أي محرر نصوص"
        fi
        
        echo ""
        print_warning "تأكد من تحديث المعلومات التالية في ملف .env:"
        echo "  - DB_HOST (عنوان خادم قاعدة البيانات)"
        echo "  - DB_NAME (اسم قاعدة البيانات)"
        echo "  - DB_USER (اسم المستخدم)"
        echo "  - DB_PASSWORD (كلمة المرور)"
        echo ""
        
        read -p "اضغط Enter بعد تحديث ملف .env..."
    else
        print_status "ملف .env موجود بالفعل"
    fi
}

# تثبيت المكتبات
install_dependencies() {
    print_info "تثبيت مكتبات Node.js..."
    
    if npm install; then
        print_status "تم تثبيت جميع المكتبات بنجاح"
    else
        print_error "فشل في تثبيت المكتبات"
        exit 1
    fi
}

# إنشاء المجلدات المطلوبة
create_directories() {
    print_info "إنشاء المجلدات المطلوبة..."
    
    directories=("logs" "public/uploads" "public/assets" "public/media")
    
    for dir in "${directories[@]}"; do
        if [ ! -d "$dir" ]; then
            mkdir -p "$dir"
            print_status "تم إنشاء مجلد: $dir"
        fi
    done
}

# اختبار اتصال قاعدة البيانات
test_database_connection() {
    print_info "اختبار اتصال قاعدة البيانات..."
    
    if npx knex migrate:status &> /dev/null; then
        print_status "اتصال قاعدة البيانات يعمل بشكل صحيح"
        return 0
    else
        print_error "فشل في الاتصال بقاعدة البيانات"
        print_warning "تحقق من معلومات قاعدة البيانات في ملف .env"
        return 1
    fi
}

# تشغيل الهجرات
run_migrations() {
    print_info "تشغيل هجرات قاعدة البيانات..."
    
    if npx knex migrate:latest; then
        print_status "تم تشغيل الهجرات بنجاح"
    else
        print_error "فشل في تشغيل الهجرات"
        return 1
    fi
}

# إدراج البيانات الأولية
run_seeds() {
    print_info "إدراج البيانات الأولية..."
    
    if npx knex seed:run; then
        print_status "تم إدراج البيانات الأولية بنجاح"
        print_info "تم إنشاء المستخدمين التاليين:"
        echo "  👤 Admin: admin@clickain.com / admin123!@#"
        echo "  👨‍💼 Creator: creator@example.com / creator123"
        echo "  👩‍💼 Buyer: buyer@example.com / buyer123"
    else
        print_error "فشل في إدراج البيانات الأولية"
        return 1
    fi
}

# اختبار تشغيل الخادم
test_server() {
    print_info "اختبار تشغيل الخادم..."
    
    # تشغيل الخادم في الخلفية
    node server.js &
    SERVER_PID=$!
    
    # انتظار قليل للخادم ليبدأ
    sleep 3
    
    # اختبار الاتصال
    if curl -s http://localhost:3000/health > /dev/null; then
        print_status "الخادم يعمل بشكل صحيح"
        
        # إيقاف الخادم
        kill $SERVER_PID 2>/dev/null
        
        return 0
    else
        print_error "فشل في تشغيل الخادم"
        
        # إيقاف الخادم في حالة الفشل
        kill $SERVER_PID 2>/dev/null
        
        return 1
    fi
}

# الدالة الرئيسية
main() {
    echo ""
    print_info "بدء عملية الإعداد التلقائي..."
    echo ""
    
    # التحقق من المتطلبات
    check_nodejs
    check_npm
    check_project_files
    
    echo ""
    print_info "إعداد المشروع..."
    
    # إعداد المشروع
    setup_env_file
    install_dependencies
    create_directories
    
    echo ""
    print_info "إعداد قاعدة البيانات..."
    
    # إعداد قاعدة البيانات
    if test_database_connection; then
        run_migrations
        run_seeds
    else
        print_error "تعذر إعداد قاعدة البيانات"
        print_info "يرجى التحقق من معلومات قاعدة البيانات في ملف .env وإعادة تشغيل السكريبت"
        exit 1
    fi
    
    echo ""
    print_info "اختبار النظام..."
    
    # اختبار النظام
    if test_server; then
        echo ""
        print_status "🎉 تم إعداد منصة كليكين بنجاح!"
        echo ""
        print_info "لتشغيل المشروع:"
        echo "  npm run dev    (للتطوير مع إعادة التشغيل التلقائي)"
        echo "  npm start      (للتشغيل العادي)"
        echo ""
        print_info "روابط مهمة:"
        echo "  🌐 الصفحة الرئيسية: http://localhost:3000"
        echo "  🔍 فحص الصحة: http://localhost:3000/health"
        echo "  📚 API التوثيق: http://localhost:3000/api"
        echo ""
        print_info "معلومات تسجيل الدخول:"
        echo "  👤 مدير النظام: admin@clickain.com / admin123!@#"
        echo "  👨‍💼 صانع محتوى: creator@example.com / creator123"
        echo "  👩‍💼 مشتري: buyer@example.com / buyer123"
        echo ""
    else
        print_error "فشل في اختبار النظام"
        exit 1
    fi
}

# تشغيل السكريبت
main

echo "انتهى الإعداد! 🚀"