#!/bin/bash

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

echo -e "${BLUE}🚀 شروع دیباگ دقیق خطای 500...${NC}"

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

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

cd "$PROJECT_PATH"

# 1. پیدا کردن آخرین خطای مربوط به request_advices_content
# ما به دنبال الگویی هستیم که خطا را گزارش کرده
ERROR_LINE=$(grep -n "request_advices_content" storage/logs/laravel.log | tail -1)

if [ -n "$ERROR_LINE" ]; then
    echo -e "${GREEN}✅ خطای یافت شد: $ERROR_LINE${NC}"
    
    # استخراج شماره خط از لاگ (فرمت لاگ لاراول معمولاً شامل شماره خط فایل است)
    # اما گاهی اوقات شماره خط در بخش Stack Trace است.
    # بیایید مستقیماً به دنبال "View:" یا فایل کنترلر بگردیم
    
    VIEW_FILE=$(grep -o "View: [^)]*" storage/logs/laravel.log | tail -1 | sed 's/View: //')
    CONTROLLER_FILE=$(grep -o "app/Http/Controllers/[^:]*" storage/logs/laravel.log | tail -1)
    
    TARGET_FILE=""
    LINE_NUMBER=""
    
    if [ -n "$VIEW_FILE" ] && [ -f "$VIEW_FILE" ]; then
        TARGET_FILE="$VIEW_FILE"
        # تلاش برای پیدا کردن شماره خط در ویو
        # لاگ لاراول معمولاً شماره خط را در انتهای خط Error نشان می‌دهد
        # اما برای اطمینان، ما کل فایل ویو را اسکن می‌کنیم تا ببینیم کدام خط شامل request_advices_content است
        # چون ممکن است چندین بار استفاده شده باشد، ما آخرین استفاده را که باعث خطا شده در نظر می‌گیریم
        
        # روش بهتر: خواندن Stack Trace برای پیدا کردن شماره خط
        # لاگ لاراول در لاراول 8+ شماره خط را در انتهای خط exception نشان می‌دهد
        # مثال: ... at /path/to/file.php:42
        STACK_LINE=$(grep -o "at [^:]*:[0-9]*" storage/logs/laravel.log | tail -1)
        if [ -n "$STACK_LINE" ]; then
            LINE_NUMBER=$(echo "$STACK_LINE" | cut -d':' -f2)
        fi
        
        echo -e "${GREEN}✅ فایل ویو: $TARGET_FILE${NC}"
        if [ -n "$LINE_NUMBER" ]; then
            echo -e "${GREEN}✅ شماره خط: $LINE_NUMBER${NC}"
        fi
        
    elif [ -n "$CONTROLLER_FILE" ] && [ -f "$CONTROLLER_FILE" ]; then
        TARGET_FILE="$CONTROLLER_FILE"
        STACK_LINE=$(grep -o "at [^:]*:[0-9]*" storage/logs/laravel.log | tail -1)
        if [ -n "$STACK_LINE" ]; then
            LINE_NUMBER=$(echo "$STACK_LINE" | cut -d':' -f2)
        fi
        echo -e "${GREEN}✅ فایل کنترلر: $TARGET_FILE${NC}"
        if [ -n "$LINE_NUMBER" ]; then
            echo -e "${GREEN}✅ شماره خط: $LINE_NUMBER${NC}"
        fi
    else
        echo -e "${RED}❌ فایل مربوط به خطا در لاگ یافت نشد.${NC}"
        echo -e "${YELLOW}⚠️ لطفاً محتوای لاگ را دستی بررسی کنید.${NC}"
        exit 1
    fi
    
    # 2. نمایش 10 خط قبل و بعد از خط مشکل‌دار
    if [ -n "$TARGET_FILE" ] && [ -n "$LINE_NUMBER" ]; then
        echo -e "\n${YELLOW}📝 نمایش 10 خط قبل و بعد از خط $LINE_NUMBER در $TARGET_FILE:${NC}"
        echo "---------------------------------------------------"
        # محاسبه شروع و پایان بازه
        START_LINE=$((LINE_NUMBER - 10))
        if [ $START_LINE -lt 1 ]; then
            START_LINE=1
        fi
        END_LINE=$((LINE_NUMBER + 10))
        
        # چاپ بازه
        sed -n "${START_LINE},${END_LINE}p" "$TARGET_FILE" | nl -ba -v $START_LINE
        echo "---------------------------------------------------"
        
        # 3. تلاش برای اصلاح خودکار
        echo -e "${YELLOW}🛠️ در حال تلاش برای اصلاح خودکار...\033[0m"
        
        # استخراج متغیر از خط مشکل‌دار
        # ما فرض می‌کنیم الگو به صورت $variable->request_advices_content است
        # از دستور grep برای پیدا کردن متغیر در خط مشکل‌دار استفاده می‌کنیم
        ERROR_LINE_CONTENT=$(sed -n "${LINE_NUMBER}p" "$TARGET_FILE")
        
        # پیدا کردن متغیر
        VARIABLE_NAME=$(echo "$ERROR_LINE_CONTENT" | grep -o '\$[a-zA-Z_]*' | head -1)
        
        if [ -n "$VARIABLE_NAME" ]; then
            echo -e "${GREEN}✅ متغیر شناسایی شد: $VARIABLE_NAME${NC}"
            echo -e "${GREEN}در حال اصلاح $TARGET_FILE برای متغیر $VARIABLE_NAME...${NC}"
            
            # اصلاح با optional()
            sed -i "${LINE_NUMBER}s/${VARIABLE_NAME}->request_advices_content/optional(${VARIABLE_NAME})->request_advices_content/g" "$TARGET_FILE"
            
            echo -e "${GREEN}✅ اصلاح انجام شد. لطفاً فایل را بررسی کنید.${NC}"
        else
            echo -e "${YELLOW}⚠️ متغیر در خط مشکل‌دار یافت نشد. ممکن است متغیر در خط دیگری تعریف شده باشد.${NC}"
            echo -e "${YELLOW}⚠️ لطفاً خروجی بالا را کپی کرده و به من بفرستید تا کد دقیق را بنویسم.${NC}"
        fi
        
    elif [ -n "$TARGET_FILE" ]; then
        echo -e "${YELLOW}⚠️ شماره خط در لاگ یافت نشد. در حال اسکن کل فایل برای پیدا کردن request_advices_content...${NC}"
        grep -n "request_advices_content" "$TARGET_FILE"
        echo -e "${YELLOW}⚠️ لطفاً شماره خطی که خطا می‌دهد را دستی مشخص کنید.${NC}"
    fi

else
    echo -e "${RED}❌ خطای request_advices_content در لاگ یافت نشد.${NC}"
    echo -e "${YELLOW}⚠️ ممکن است خطا تغییر کرده باشد. لطفاً لاگ را دستی بررسی کنید.${NC}"
fi

echo -e "${GREEN}✅ فرآیند دیباگ تمام شد.${NC}"
