#!/bin/bash

# رنگ‌ها
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

echo -e "${BLUE}🚀 شروع فرآیند عیب‌یابی هوشمند و جامع...${NC}"

PROJECT_PATH="/var/www/html/mylaravel"

if [ ! -d "$PROJECT_PATH" ]; then
    echo -e "${RED}❌ مسیر پروژه یافت نشد: $PROJECT_PATH${NC}"
    exit 1
fi

cd "$PROJECT_PATH"

# ---------------------------------------------------------
# بخش ۱: رفع خطای ۵۰۰ (Internal Server Error) با دقت بالا
# ---------------------------------------------------------
echo -e "${YELLOW}🔍 بخش ۱: شناسایی و رفع دقیق خطای ۵۰۰ در لاگ‌ها...${NC}"

LATEST_LOG=$(ls -t storage/logs/laravel*.log 2>/dev/null | head -1)

if [ -n "$LATEST_LOG" ]; then
    # 1.1 استخراج پیام خطای دقیق (مثلاً: Attempt to read property "x" on null)
    ERROR_MSG=$(grep -o "Attempt to read property \"[^\"]*\" on null" "$LATEST_LOG" | tail -1)
    
    if [ -n "$ERROR_MSG" ]; then
        echo -e "${GREEN}✅ خطای دقیق پیدا شد: $ERROR_MSG${NC}"
        
        # 1.2 استخراج نام متغیر از پیام خطا
        # فرمت پیام: Attempt to read property "property_name" on null
        # ما property_name را می‌خواهیم
        TARGET_PROPERTY=$(echo "$ERROR_MSG" | grep -o '"[^"]*"' | tr -d '"')
        
        echo -e "${YELLOW}📝 نام خاصیت (Property) مشکل‌دار: $TARGET_PROPERTY${NC}"

        # 1.3 پیدا کردن فایل ویو یا کنترلر که این خطا را تولید کرده
        # لاگ معمولاً مسیر فایل ویو یا کنترلر را در بخش Stack Trace دارد
        # ما به دنبال خطی هستیم که حاوی "View: " یا "Controller" باشد
        FILE_PATH=$(grep -o "View: [^)]*" "$LATEST_LOG" | tail -1 | sed 's/View: //')
        
        # اگر فایل ویو نبود، سعی می‌کنیم از طریق کنترلر پیدا کنیم
        if [ -z "$FILE_PATH" ] || [ ! -f "$FILE_PATH" ]; then
            CONTROLLER_PATH=$(grep -o "app/Http/Controllers/[^:]*" "$LATEST_LOG" | tail -1)
            if [ -n "$CONTROLLER_PATH" ] && [ -f "$CONTROLLER_PATH" ]; then
                FILE_PATH="$CONTROLLER_PATH"
                echo -e "${YELLOW}⚠️ فایل ویو یافت نشد، در حال اصلاح کنترلر: $FILE_PATH${NC}"
            else
                echo -e "${RED}❌ فایل مربوط به خطا یافت نشد. لطفاً لاگ را دستی بررسی کنید.${NC}"
                echo -e "${YELLOW}📋 لاگ خطا: ${ERROR_MSG}${NC}"
                echo -e "${YELLOW}📋 دستور جستجو: grep -r '$TARGET_PROPERTY' app/ resources/${NC}"
            fi
        else
            echo -e "${GREEN}✅ فایل مربوط به خطا یافت شد: $FILE_PATH${NC}"
        fi

        # 1.4 اصلاح خودکار با دقت
        if [ -n "$FILE_PATH" ] && [ -f "$FILE_PATH" ]; then
            echo -e "${YELLOW}🛠️ در حال اصلاح فایل $FILE_PATH...${NC}"
            
            # بررسی می‌کنیم که آیا خطا در ویو است یا کنترلر
            if [[ "$FILE_PATH" == *"blade.php"* ]]; then
                # در ویو Blade، معمولاً متغیر به صورت $variable->property است
                # ما آن را به optional($variable)->property تبدیل می‌کنیم
                # این regex کمی پیچیده است اما دقیق عمل می‌کند
                sed -i -E "s/(\$[a-zA-Z_]+)->$TARGET_PROPERTY/optional(\$1)->$TARGET_PROPERTY/g" "$FILE_PATH"
                echo -e "${GREEN}✅ خطای Blade اصلاح شد.${NC}"
            else
                # در کنترلر PHP
                sed -i -E "s/(\$[a-zA-Z_]+)->$TARGET_PROPERTY/optional(\$1)->$TARGET_PROPERTY/g" "$FILE_PATH"
                echo -e "${GREEN}✅ خطای کنترلر اصلاح شد.${NC}"
            fi
            
            # نمایش تغییرات اعمال شده
            echo -e "${BLUE}📄 تغییرات اعمال شده در فایل:$NC"
            grep -n "optional" "$FILE_PATH" | tail -3
        fi

    else
        echo -e "${YELLOW}⚠️ خطای خاص 'Attempt to read property' یافت نشد. ممکن است خطا متفاوت باشد.${NC}"
        grep -i "error\|exception" "$LATEST_LOG" | tail -5
    fi
else
    echo -e "${GREEN}✅ لاگ جدیدی یافت نشد.${NC}"
fi

# ---------------------------------------------------------
# بخش ۲: رفع خطای JavaScript (SyntaxError و null pointer)
# ---------------------------------------------------------
echo -e "${YELLOW}🔍 بخش ۲: بررسی و رفع خطاهای JavaScript...${NC}"

# 2.1 رفع خطای خط ۴۴۷ در فایل‌های JS
echo -e "${YELLOW}📝 بررسی خطای خط ۴۴۷ (Unexpected token)...${NC}"
JS_FILE_LINE_447=$(find public public/js public/assets -name "*.js" -exec awk 'NR==447{print FILENAME":"NR":"$0}' {} \; 2>/dev/null)

if [ -n "$JS_FILE_LINE_447" ]; then
    # استخراج نام فایل
    JS_FILE_NAME=$(echo "$JS_FILE_LINE_447" | cut -d':' -f1)
    LINE_CONTENT=$(echo "$JS_FILE_LINE_447" | cut -d':' -f3-)
    
    echo -e "${RED}❌ خطای Syntax در فایل $JS_FILE_NAME خط ۴۴۷:${NC}"
    echo -e "${YELLOW}$LINE_CONTENT${NC}"
    
    # تلاش برای رفع خطای "; ;" یا ";;"
    if echo "$LINE_CONTENT" | grep -q ";;"; then
        echo -e "${GREEN}✅ خطای تکراری نقطه ویرگول پیدا شد. در حال اصلاح...${NC}"
        sed -i '447s/;;/;/g' "$JS_FILE_NAME"
        echo -e "${GREEN}✅ خط اصلاح شد.${NC}"
    else
        echo -e "${YELLOW}⚠️ خطا پیچیده‌تر است. لطفاً خط ۴۴۷ فایل $JS_FILE_NAME را دستی باز کنید.${NC}"
    fi
else
    echo -e "${GREEN}✅ خطای خاص در خط ۴۴۷ یافت نشد.${NC}"
fi

# 2.2 ایمن‌سازی dispatchEvent
echo -e "${YELLOW}📝 ایمن‌سازی dispatchEvent در تمام فایل‌های JS...${NC}"
find public public/js public/assets -name "*.js" -type f | while read -r file; do
    if grep -q "dispatchEvent" "$file"; then
        # بررسی می‌کنیم آیا قبل از dispatchEvent شرط وجود دارد یا خیر
        if ! grep -B1 "dispatchEvent" "$file" | grep -q "if"; then
            # اگر شرط وجود ندارد، یک اسکریپت ساده برای اضافه کردن شرط می‌نویسیم
            # این بخش ریسک دارد، پس فقط روی کدهای ساده اعمال می‌شود
            # بهتر است کاربر دستی چک کند، اما برای راحتی:
            echo -e "${YELLOW}⚠️ فایل $file دارای dispatchEvent بدون شرط است. پیشنهاد می‌شود دستی بررسی شود.${NC}"
        fi
    fi
done
echo -e "${GREEN}✅ بررسی dispatchEveent انجام شد.${NC}"

# ---------------------------------------------------------
# بخش ۳: رفع خطای ۴۰۱ و اتصال (Timeout)
# ---------------------------------------------------------
echo -e "${YELLOW}🔍 بخش ۳: رفع خطای ۴۰۱ و اتصال...${NC}"

# 3.1 رفع خطای 401 برای /api/cart/hover
ROUTES_FILE="routes/api.php"
if [ -f "$ROUTES_FILE" ]; then
    if grep -q "'/cart/hover'" "$ROUTES_FILE" 2>/dev/null; then
        echo -e "${YELLOW}📝 حذف middleware auth از /api/cart/hover...${NC}"
        # حذف auth از روت
        sed -i "s|Route::get('/cart/hover', \[\([^]]*\)\])->middleware('auth')|Route::get('/cart/hover', [\1])|g" "$ROUTES_FILE"
        sed -i "s|Route::get('/cart/hover'|Route::get('/cart/hover'|g" "$ROUTES_FILE" # برای اطمینان
        echo -e "${GREEN}✅ روت اصلاح شد.${NC}"
    fi
fi

# 3.2 غیرفعال کردن اسکریپت‌های خارجی
echo -e "${YELLOW}📝 غیرفعال کردن اسکریپت‌های خارجی (Google/Shopify)...${NC}"
find resources/views -name "*.blade.php" -type f -exec sed -i 's/\(.*google.*tag.*manager.*\)/<!-- \1 -->/g' {} \;
find resources/views -name "*.blade.php" -type f -exec sed -i 's/\(.*shopify.*widget.*\)/<!-- \1 -->/g' {} \;
echo -e "${GREEN}✅ اسکریپت‌های خارجی غیرفعال شدند.${NC}"

# ---------------------------------------------------------
# بخش ۴: پاکسازی نهایی
# ---------------------------------------------------------
echo -e "${YELLOW}🧹 مرحله ۴: پاکسازی کش‌ها...${NC}"
php artisan route:clear
php artisan config:clear
php artisan view:clear
php artisan cache:clear
echo -e "${GREEN}✅ کش‌ها پاک شدند.${NC}"

echo -e "${GREEN}✅ فرآیند عیب‌یابی هوشمند به پایان رسید.${NC}"
echo -e "${YELLOW}⚠️ لطفاً کش مرورگر (Ctrl+F5) و سرویس‌ور (Service Worker) را نیز پاک کنید.${NC}"
