<?php
/**
 * دالة تصحيح الروابط القديمة دفعياً
 * Batch URL Fix Utility
 * 
 * Actions:
 * - scan: فحص الروابط القديمة
 * - preview: معاينة التغييرات قبل التنفيذ
 * - fix: تنفيذ التصحيح
 */

require_once 'db.php';

// كلمة مرور الأمان (نفسها في db-manager.php)
define('FIX_URLS_PASSWORD', 'Zagel@DB2024!');

// الجداول والأعمدة المستهدفة (فقط الأعمدة الموجودة فعلياً)
$URL_COLUMNS = [
    ['table' => 'expenses', 'field' => 'receipt_url'],
    ['table' => 'products', 'field' => 'image_url'],
    ['table' => 'sellers', 'field' => 'seller_logo_url'],
    ['table' => 'sellers', 'field' => 'fawtra_logo_url'],
    ['table' => 'invoices', 'field' => 'pdf_file'],
];

// التحقق من كلمة المرور
function verifyPassword($input) {
    $password = $input['password'] ?? '';
    if ($password !== FIX_URLS_PASSWORD) {
        jsonResponse(false, 'كلمة المرور غير صحيحة', null, 403);
        exit;
    }
}

// فحص الروابط القديمة
function scanOldUrls($searchPath = null) {
    global $pdo, $URL_COLUMNS;
    
    $results = [];
    $totalCount = 0;
    
    foreach ($URL_COLUMNS as $col) {
        $table = $col['table'];
        $field = $col['field'];
        
        try {
            // بناء الاستعلام
            if ($searchPath) {
                // البحث عن مسار محدد
                $sql = "SELECT COUNT(*) as count, 
                        GROUP_CONCAT({$field} SEPARATOR '|||') as examples 
                        FROM {$table} 
                        WHERE {$field} LIKE :pattern 
                        LIMIT 100";
                $stmt = $pdo->prepare($sql);
                $stmt->execute(['pattern' => "%{$searchPath}%"]);
            } else {
                // البحث عن أي مسار uploads لا يتطابق مع الحالي
                $sql = "SELECT COUNT(*) as count, 
                        GROUP_CONCAT({$field} SEPARATOR '|||') as examples 
                        FROM {$table} 
                        WHERE {$field} LIKE '%/uploads/%'
                        LIMIT 100";
                $stmt = $pdo->prepare($sql);
                $stmt->execute();
            }
            
            $row = $stmt->fetch(PDO::FETCH_ASSOC);
            $count = intval($row['count'] ?? 0);
            $examples = $row['examples'] ? array_slice(explode('|||', $row['examples']), 0, 5) : [];
            
            $results[] = [
                'table' => $table,
                'field' => $field,
                'count' => $count,
                'examples' => $examples
            ];
            
            $totalCount += $count;
        } catch (Exception $e) {
            $results[] = [
                'table' => $table,
                'field' => $field,
                'count' => 0,
                'examples' => [],
                'error' => $e->getMessage()
            ];
        }
    }
    
    return [
        'search_path' => $searchPath,
        'total_count' => $totalCount,
        'results' => $results,
        'supported_tables' => array_map(function($col) {
            return "{$col['table']}.{$col['field']}";
        }, $URL_COLUMNS)
    ];
}

// معاينة التغييرات
function previewChanges($oldPath, $newPath) {
    global $pdo, $URL_COLUMNS;
    
    $previews = [];
    $totalAffected = 0;
    
    foreach ($URL_COLUMNS as $col) {
        $table = $col['table'];
        $field = $col['field'];
        
        try {
            // جلب السجلات المتأثرة
            $sql = "SELECT id, {$field} as old_url 
                    FROM {$table} 
                    WHERE {$field} LIKE :pattern 
                    LIMIT 10";
            $stmt = $pdo->prepare($sql);
            $stmt->execute(['pattern' => "%{$oldPath}%"]);
            $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
            
            $changes = [];
            foreach ($rows as $row) {
                $newUrl = str_replace($oldPath, $newPath, $row['old_url']);
                $changes[] = [
                    'id' => $row['id'],
                    'old_url' => $row['old_url'],
                    'new_url' => $newUrl
                ];
            }
            
            // عدد السجلات الكلي
            $countSql = "SELECT COUNT(*) as total FROM {$table} WHERE {$field} LIKE :pattern";
            $countStmt = $pdo->prepare($countSql);
            $countStmt->execute(['pattern' => "%{$oldPath}%"]);
            $total = intval($countStmt->fetch(PDO::FETCH_ASSOC)['total']);
            
            $previews[] = [
                'table' => $table,
                'field' => $field,
                'total_affected' => $total,
                'sample_changes' => $changes
            ];
            
            $totalAffected += $total;
        } catch (Exception $e) {
            $previews[] = [
                'table' => $table,
                'field' => $field,
                'total_affected' => 0,
                'sample_changes' => [],
                'error' => $e->getMessage()
            ];
        }
    }
    
    return [
        'old_path' => $oldPath,
        'new_path' => $newPath,
        'total_affected' => $totalAffected,
        'previews' => $previews
    ];
}

// تنفيذ التصحيح
function fixUrls($oldPath, $newPath, $dryRun = false) {
    global $pdo, $URL_COLUMNS;
    
    $results = [];
    $totalUpdated = 0;
    $criticalErrors = [];
    $warnings = [];
    
    // بدء المعاملة
    if (!$dryRun) {
        $pdo->beginTransaction();
    }
    
    try {
        foreach ($URL_COLUMNS as $col) {
            $table = $col['table'];
            $field = $col['field'];
            
            try {
                if ($dryRun) {
                    // وضع المعاينة - عد فقط
                    $sql = "SELECT COUNT(*) as count FROM {$table} WHERE {$field} LIKE :pattern";
                    $stmt = $pdo->prepare($sql);
                    $stmt->execute(['pattern' => "%{$oldPath}%"]);
                    $count = intval($stmt->fetch(PDO::FETCH_ASSOC)['count']);
                    
                    $results[] = [
                        'table' => $table,
                        'field' => $field,
                        'would_update' => $count
                    ];
                    $totalUpdated += $count;
                } else {
                    // تنفيذ التحديث الفعلي
                    $sql = "UPDATE {$table} SET {$field} = REPLACE({$field}, :old_path, :new_path) WHERE {$field} LIKE :pattern";
                    $stmt = $pdo->prepare($sql);
                    $stmt->execute([
                        'old_path' => $oldPath,
                        'new_path' => $newPath,
                        'pattern' => "%{$oldPath}%"
                    ]);
                    $updated = $stmt->rowCount();
                    
                    $results[] = [
                        'table' => $table,
                        'field' => $field,
                        'updated' => $updated
                    ];
                    $totalUpdated += $updated;
                }
            } catch (Exception $e) {
                $errorMsg = $e->getMessage();
                
                // تصنيف الخطأ: هل هو خطأ عمود غير موجود؟
                if (strpos($errorMsg, 'Column not found') !== false || 
                    strpos($errorMsg, 'Unknown column') !== false ||
                    strpos($errorMsg, 'doesn\'t exist') !== false) {
                    // تحذير فقط - العمود غير موجود
                    $warnings[] = "{$table}.{$field}: العمود غير موجود (تم تجاهله)";
                    $results[] = [
                        'table' => $table,
                        'field' => $field,
                        'updated' => 0,
                        'warning' => 'العمود غير موجود'
                    ];
                } else {
                    // خطأ حرج
                    $criticalErrors[] = "{$table}.{$field}: " . $errorMsg;
                    $results[] = [
                        'table' => $table,
                        'field' => $field,
                        'updated' => 0,
                        'error' => $errorMsg
                    ];
                }
            }
        }
        
        // تأكيد المعاملة إذا لا توجد أخطاء حرجة
        if (!$dryRun) {
            if (empty($criticalErrors)) {
                $pdo->commit();  // ✅ تأكيد التحديثات الناجحة
            } else {
                $pdo->rollBack();
            }
        }
        
    } catch (Exception $e) {
        if (!$dryRun) {
            $pdo->rollBack();
        }
        throw $e;
    }
    
    return [
        'old_path' => $oldPath,
        'new_path' => $newPath,
        'dry_run' => $dryRun,
        'total_updated' => $totalUpdated,
        'results' => $results,
        'errors' => $criticalErrors,
        'warnings' => $warnings,
        'success' => empty($criticalErrors)
    ];
}

// معالجة الطلب
$action = $_GET['action'] ?? 'scan';
$input = getJsonInput();

switch ($action) {
    case 'scan':
        // فحص الروابط القديمة
        verifyPassword($input);
        $searchPath = sanitize($input['search_path'] ?? null);
        $data = scanOldUrls($searchPath);
        jsonResponse(true, 'تم الفحص بنجاح', $data);
        break;
        
    case 'preview':
        // معاينة التغييرات
        verifyPassword($input);
        $oldPath = sanitize($input['old_path'] ?? '');
        $newPath = sanitize($input['new_path'] ?? '');
        
        if (empty($oldPath) || empty($newPath)) {
            jsonResponse(false, 'يرجى تحديد المسار القديم والجديد', null, 400);
        }
        
        $data = previewChanges($oldPath, $newPath);
        jsonResponse(true, 'تمت المعاينة', $data);
        break;
        
    case 'fix':
        // تنفيذ التصحيح
        verifyPassword($input);
        $oldPath = sanitize($input['old_path'] ?? '');
        $newPath = sanitize($input['new_path'] ?? '');
        $dryRun = (bool)($input['dry_run'] ?? false);
        
        if (empty($oldPath) || empty($newPath)) {
            jsonResponse(false, 'يرجى تحديد المسار القديم والجديد', null, 400);
        }
        
        $data = fixUrls($oldPath, $newPath, $dryRun);
        
        if ($data['success']) {
            $msg = $dryRun 
                ? "سيتم تحديث {$data['total_updated']} رابط" 
                : "تم تحديث {$data['total_updated']} رابط بنجاح";
            jsonResponse(true, $msg, $data);
        } else {
            jsonResponse(false, 'فشل في تحديث بعض الروابط', $data, 500);
        }
        break;
        
    default:
        jsonResponse(false, 'إجراء غير معروف', null, 400);
}
