<?php
/**
 * استيراد النتائج من ملف CSV/Excel - نسخة مطورة
 * يدعم: CSV, Excel (XLSX), معاينة البيانات، خيارات متقدمة
 */
use App\Core\Auth;
use App\Core\Tenant;

$tenantId = (int)Tenant::id();

if (!($auth instanceof Auth) || (!$auth->can('results.edit') && !$auth->can('results.validate'))) {
    http_response_code(403);
    echo 'غير مسموح بالوصول إلى هذه الصفحة';
    return;
}

$action = $_GET['action'] ?? 'index';
$msg = '';
$errors = [];
$warnings = [];
$previewData = null;
$importStats = [
    'total' => 0,
    'imported' => 0,
    'updated' => 0,
    'skipped' => 0,
    'failed' => 0
];

// تحميل قالب CSV
if ($action === 'download_template') {
    header('Content-Type: text/csv; charset=UTF-8');
    header('Content-Disposition: attachment; filename="template_results_' . date('Y-m-d') . '.csv"');
    echo "\xEF\xBB\xBF"; // BOM for Excel
    echo "order_number,test_code,result_value,unit,flag,notes\n";
    echo "O12345,CBC_Hb,14.2,g/dL,N,\n";
    echo "O12345,CBC_WBC,7.5,10^3/μL,N,\n";
    exit;
}

// معاينة البيانات
if ($action === 'preview' && $_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['csv_file']) && $_FILES['csv_file']['error'] === UPLOAD_ERR_OK) {
    $path = $_FILES['csv_file']['tmp_name'];
    $ext = strtolower(pathinfo($_FILES['csv_file']['name'], PATHINFO_EXTENSION));
    
    $rows = [];
    if ($ext === 'csv') {
        $fp = fopen($path, 'r');
        if ($fp) {
            $bom = fread($fp, 3);
            if ($bom !== "\xEF\xBB\xBF") rewind($fp);
            while (($r = fgetcsv($fp, 0, ',')) !== false) {
                $rows[] = $r;
            }
            fclose($fp);
        }
    } elseif (in_array($ext, ['xlsx', 'xls'])) {
        // دعم Excel بسيط - يحتاج مكتبة PhpSpreadsheet
        $msg = 'دعم Excel قيد التطوير. استخدم CSV حالياً.';
    } else {
        $msg = 'صيغة الملف غير مدعومة. استخدم CSV أو Excel.';
    }
    
    if (!empty($rows) && $msg === '') {
        $header = array_map('trim', $rows[0]);
        $headerLower = array_map('strtolower', $header);
        
        // البحث عن الأعمدة المطلوبة
        $colOrder = array_search('order_number', $headerLower) !== false ? 'order_number' : 
                   (array_search('order_id', $headerLower) !== false ? 'order_id' : null);
        $colTest = array_search('test_code', $headerLower) !== false ? 'test_code' : 
                  (array_search('test_id', $headerLower) !== false ? 'test_id' : null);
        $colValue = array_search('result_value', $headerLower) !== false ? 'result_value' : 
                   (array_search('value', $headerLower) !== false ? 'value' : null);
        $colUnit = array_search('unit', $headerLower) !== false ? 'unit' : null;
        $colFlag = array_search('flag', $headerLower) !== false ? 'flag' : null;
        $colNotes = array_search('notes', $headerLower) !== false ? 'notes' : null;
        
        if (!$colOrder || !$colTest || !$colValue) {
            $msg = 'الملف يجب أن يحتوي أعمدة: order_number (أو order_id), test_code (أو test_id), result_value (أو value)';
        } else {
            $idxOrder = array_search($colOrder, $headerLower);
            $idxTest = array_search($colTest, $headerLower);
            $idxValue = array_search($colValue, $headerLower);
            $idxUnit = $colUnit ? array_search($colUnit, $headerLower) : false;
            $idxFlag = $colFlag ? array_search($colFlag, $headerLower) : false;
            $idxNotes = $colNotes ? array_search($colNotes, $headerLower) : false;
            
            $previewData = [
                'header' => $header,
                'rows' => array_slice($rows, 1, 10), // أول 10 صفوف للمعاينة
                'total_rows' => count($rows) - 1,
                'columns' => [
                    'order' => $idxOrder,
                    'test' => $idxTest,
                    'value' => $idxValue,
                    'unit' => $idxUnit,
                    'flag' => $idxFlag,
                    'notes' => $idxNotes
                ]
            ];
            
            // حفظ البيانات في session للمعالجة لاحقاً
            $_SESSION['import_file_path'] = $path;
            $_SESSION['import_file_name'] = $_FILES['csv_file']['name'];
            $_SESSION['import_columns'] = $previewData['columns'];
        }
    }
}

// تنفيذ الاستيراد
if ($action === 'import' && $_SERVER['REQUEST_METHOD'] === 'POST') {
    $importMode = $_POST['import_mode'] ?? 'update'; // update, insert, skip_existing
    $autoValidate = isset($_POST['auto_validate']) ? 1 : 0;
    $updateExisting = $importMode === 'update';
    
    if (isset($_SESSION['import_file_path']) && file_exists($_SESSION['import_file_path'])) {
        $path = $_SESSION['import_file_path'];
        $columns = $_SESSION['import_columns'] ?? [];
        
        $rows = [];
        $fp = fopen($path, 'r');
        if ($fp) {
            $bom = fread($fp, 3);
            if ($bom !== "\xEF\xBB\xBF") rewind($fp);
            while (($r = fgetcsv($fp, 0, ',')) !== false) {
                $rows[] = $r;
            }
            fclose($fp);
        }
        
        if (!empty($rows)) {
            $header = array_map('trim', $rows[0]);
            $importStats['total'] = count($rows) - 1;
            
            $tenantAnd = '';
            try { 
                $db->query('SELECT tenant_id FROM lab_orders LIMIT 1'); 
                $tenantAnd = ' AND o.tenant_id = ' . $tenantId; 
            } catch (Throwable $e) {}
            
            $testAnd = '';
            try { 
                $db->query('SELECT tenant_id FROM tests LIMIT 1'); 
                $testAnd = ' AND t.tenant_id = ' . $tenantId; 
            } catch (Throwable $e) {}
            
            $db->beginTransaction();
            
            try {
                for ($i = 1; $i < count($rows); $i++) {
                    $r = $rows[$i];
                    $orderRef = trim($r[$columns['order']] ?? '');
                    $testRef = trim($r[$columns['test']] ?? '');
                    $value = trim($r[$columns['value']] ?? '');
                    $unit = isset($columns['unit']) && $columns['unit'] !== false ? trim($r[$columns['unit']] ?? '') : null;
                    $flag = isset($columns['flag']) && $columns['flag'] !== false ? trim($r[$columns['flag']] ?? '') : null;
                    $notes = isset($columns['notes']) && $columns['notes'] !== false ? trim($r[$columns['notes']] ?? '') : null;
                    
                    if ($orderRef === '' || $testRef === '' || $value === '') {
                        $importStats['skipped']++;
                        $warnings[] = "سطر " . ($i + 1) . ": بيانات ناقصة";
                        continue;
                    }
                    
                    $orderNum = preg_match('/^O/i', $orderRef) ? $orderRef : 'O' . $orderRef;
                    
                    try {
                        // البحث عن الطلب (مع بيانات الطبيب والمريض للإشعارات)
                        $stmt = $db->prepare('SELECT o.id, o.order_number, o.patient_id, o.doctor_id, o.tenant_id FROM lab_orders o WHERE (o.order_number = ? OR o.id = ?)' . $tenantAnd . ' LIMIT 1');
                        $stmt->execute([$orderNum, is_numeric($orderRef) ? (int)$orderRef : 0]);
                        $orderRow = $stmt->fetch();
                        if (!$orderRow) {
                            $importStats['skipped']++;
                            $warnings[] = "سطر " . ($i + 1) . ": الطلب '$orderRef' غير موجود";
                            continue;
                        }
                        
                        $orderId = (int)$orderRow['id'];
                        
                        // البحث عن الفحص
                        $stmt = $db->prepare('SELECT t.id, t.name AS test_name, t.reference_range, t.critical_value_min, t.critical_value_max FROM tests t WHERE (t.test_code = ? OR t.id = ?)' . $testAnd . ' LIMIT 1');
                        $stmt->execute([$testRef, is_numeric($testRef) ? (int)$testRef : 0]);
                        $testRow = $stmt->fetch();
                        if (!$testRow) {
                            $importStats['skipped']++;
                            $warnings[] = "سطر " . ($i + 1) . ": الفحص '$testRef' غير موجود";
                            continue;
                        }
                        
                        $testId = (int)$testRow['id'];
                        $referenceRange = $testRow['reference_range'] ?? null;
                        $criticalMin = $testRow['critical_value_min'] ?? null;
                        $criticalMax = $testRow['critical_value_max'] ?? null;
                        
                        // البحث عن order_item
                        $stmt = $db->prepare('SELECT oi.id FROM order_items oi WHERE oi.order_id = ? AND oi.test_id = ? LIMIT 1');
                        $stmt->execute([$orderId, $testId]);
                        $oiRow = $stmt->fetch();
                        if (!$oiRow) {
                            $importStats['skipped']++;
                            $warnings[] = "سطر " . ($i + 1) . ": الفحص '$testRef' غير موجود في الطلب '$orderRef'";
                            continue;
                        }
                        
                        $itemId = (int)$oiRow['id'];
                        
                        // التحقق من وجود نتيجة
                        $stmt = $db->prepare('SELECT id FROM results WHERE order_item_id = ?');
                        $stmt->execute([$itemId]);
                        $existing = $stmt->fetch();
                        
                        // تحديد الـ flag تلقائياً إذا لم يُحدد
                        if (!$flag && $referenceRange) {
                            require_once __DIR__ . '/../src/Core/ResultValidator.php';
                            $flagStatus = \App\Core\ResultValidator::checkValue(
                                $value,
                                $referenceRange,
                                $criticalMin,
                                $criticalMax
                            );
                            $flagMap = ['normal' => 'N', 'high' => 'H', 'low' => 'L', 'critical' => 'C'];
                            $flag = $flagMap[$flagStatus] ?? 'N';
                        }
                        
                        $techName = $_SESSION['user_name'] ?? '';
                        try {
                            $db->query('SELECT tech_name FROM results LIMIT 1');
                        } catch (Throwable $e) {
                            $techName = '';
                        }
                        
                        if ($existing) {
                            if ($importMode === 'skip_existing') {
                                $importStats['skipped']++;
                                continue;
                            }
                            
                            // تحديث النتيجة الموجودة
                            $sql = 'UPDATE results SET result_value=?, unit=?, flag=?, notes=?, result_date=NOW()' . 
                                   ($autoValidate ? ', validated_at=NOW()' : '') .
                                   ($techName !== '' ? ', tech_name=?' : '') .
                                   ' WHERE order_item_id=?';
                            $params = [
                                $value !== '' ? $value : null,
                                $unit ?: null,
                                $flag ?: null,
                                $notes ?: null
                            ];
                            if ($techName !== '') $params[] = $techName;
                            $params[] = $itemId;
                            
                            $stmt = $db->prepare($sql);
                            $stmt->execute($params);
                            $importStats['updated']++;
                        } else {
                            // إضافة نتيجة جديدة
                            $sql = 'INSERT INTO results (order_item_id, result_value, unit, flag, notes, result_date' . 
                                   ($autoValidate ? ', validated_at' : '') .
                                   ($techName !== '' ? ', tech_name' : '') .
                                   ') VALUES (?, ?, ?, ?, ?, NOW()' .
                                   ($autoValidate ? ', NOW()' : '') .
                                   ($techName !== '' ? ', ?' : '') .
                                   ')';
                            $params = [
                                $itemId,
                                $value !== '' ? $value : null,
                                $unit ?: null,
                                $flag ?: null,
                                $notes ?: null
                            ];
                            if ($techName !== '') $params[] = $techName;
                            
                            $stmt = $db->prepare($sql);
                            $stmt->execute($params);
                            $importStats['imported']++;
                        }
                        
                        // تحديث حالة order_item
                        if ($autoValidate) {
                            $stmt = $db->prepare('UPDATE order_items SET status=? WHERE id=?');
                            $stmt->execute(['validated', $itemId]);
                        } else {
                            $stmt = $db->prepare('UPDATE order_items SET status=? WHERE id=?');
                            $stmt->execute(['result_entered', $itemId]);
                        }
                        
                        $importStats['imported'] += ($existing ? 0 : 1);
                        
                        // إشعار الطبيب عند نتيجة حرجة
                        if ($flag === 'C' && !empty($orderRow['doctor_id']) && (int)$orderRow['doctor_id'] > 0) {
                            try {
                                require_once __DIR__ . '/../src/Core/DoctorNotification.php';
                                $notifier = new \App\Core\DoctorNotification($db, $config ?? []);
                                $notifier->notifyCriticalResult(
                                    $orderId,
                                    (int)$orderRow['patient_id'],
                                    (int)$orderRow['doctor_id'],
                                    (int)($orderRow['tenant_id'] ?? $tenantId),
                                    $testRow['test_name'] ?? $testRef,
                                    $value,
                                    $orderRow['order_number'] ?? null
                                );
                            } catch (Throwable $ex) {
                                error_log('Import critical notify: ' . $ex->getMessage());
                            }
                        }
                        
                    } catch (Throwable $e) {
                        $importStats['failed']++;
                        $errors[] = "سطر " . ($i + 1) . ": " . $e->getMessage();
                    }
                }
                
                $db->commit();
                
                // تحديث حالة الطلبات المكتملة
                if ($autoValidate) {
                    $stmt = $db->prepare("
                        UPDATE lab_orders o
                        SET o.status = 'completed',
                            o.completed_at = CASE WHEN o.completed_at IS NULL THEN NOW() ELSE o.completed_at END
                        WHERE o.id IN (
                            SELECT DISTINCT oi.order_id
                            FROM order_items oi
                            WHERE oi.status = 'validated'
                            AND NOT EXISTS (
                                SELECT 1 FROM order_items oi2
                                WHERE oi2.order_id = oi.order_id
                                AND oi2.status != 'validated'
                            )
                        )
                    ");
                    $stmt->execute();
                }
                
                $msg = "تم استيراد " . ($importStats['imported'] + $importStats['updated']) . " نتيجة بنجاح.";
                if ($importStats['updated'] > 0) $msg .= " (تم تحديث " . $importStats['updated'] . ")";
                if ($importStats['skipped'] > 0) $msg .= " (تم تخطي " . $importStats['skipped'] . ")";
                if ($importStats['failed'] > 0) $msg .= " (فشل " . $importStats['failed'] . ")";
                
                // مسح البيانات المؤقتة
                unset($_SESSION['import_file_path'], $_SESSION['import_file_name'], $_SESSION['import_columns']);
                
            } catch (Throwable $e) {
                $db->rollBack();
                $msg = 'خطأ في الاستيراد: ' . $e->getMessage();
            }
        }
    } else {
        $msg = 'لم يتم العثور على الملف. يرجى رفع الملف مرة أخرى.';
    }
}

// عرض صفحة المعاينة
if ($action === 'preview' && $previewData) {
    ?>
    <div class="page-header">
        <h1>معاينة البيانات قبل الاستيراد</h1>
    </div>
    
    <div class="card" style="margin-bottom:16px;">
        <h3>معلومات الملف</h3>
        <p><strong>اسم الملف:</strong> <?php echo htmlspecialchars($_SESSION['import_file_name'] ?? 'غير معروف', ENT_QUOTES, 'UTF-8'); ?></p>
        <p><strong>عدد الصفوف:</strong> <?php echo number_format($previewData['total_rows']); ?></p>
        <p><strong>الأعمدة المكتشفة:</strong></p>
        <ul>
            <li>رقم الطلب: <?php echo htmlspecialchars($previewData['header'][$previewData['columns']['order']] ?? '-', ENT_QUOTES, 'UTF-8'); ?></li>
            <li>كود الفحص: <?php echo htmlspecialchars($previewData['header'][$previewData['columns']['test']] ?? '-', ENT_QUOTES, 'UTF-8'); ?></li>
            <li>قيمة النتيجة: <?php echo htmlspecialchars($previewData['header'][$previewData['columns']['value']] ?? '-', ENT_QUOTES, 'UTF-8'); ?></li>
        </ul>
    </div>
    
    <div class="card" style="margin-bottom:16px;">
        <h3>معاينة البيانات (أول 10 صفوف)</h3>
        <div class="table-wrapper">
            <table class="table">
                <thead>
                    <tr>
                        <?php foreach ($previewData['header'] as $h): ?>
                        <th><?php echo htmlspecialchars($h, ENT_QUOTES, 'UTF-8'); ?></th>
                        <?php endforeach; ?>
                    </tr>
                </thead>
                <tbody>
                    <?php foreach ($previewData['rows'] as $row): ?>
                    <tr>
                        <?php foreach ($row as $cell): ?>
                        <td><?php echo htmlspecialchars($cell ?? '', ENT_QUOTES, 'UTF-8'); ?></td>
                        <?php endforeach; ?>
                    </tr>
                    <?php endforeach; ?>
                </tbody>
            </table>
        </div>
    </div>
    
    <div class="card">
        <h3>خيارات الاستيراد</h3>
        <form method="post" action="index.php?page=import_results&action=import" class="form-grid">
            <div class="full-width">
                <label>طريقة الاستيراد</label>
                <select name="import_mode" required>
                    <option value="update">تحديث النتائج الموجودة وإضافة الجديدة</option>
                    <option value="insert">إضافة جديدة فقط (تخطي الموجودة)</option>
                    <option value="skip_existing">تخطي النتائج الموجودة</option>
                </select>
            </div>
            <div class="full-width">
                <label style="display:flex;align-items:center;gap:8px;">
                    <input type="checkbox" name="auto_validate" checked>
                    <span>اعتماد النتائج تلقائياً</span>
                </label>
                <small style="color:var(--text-muted);">سيتم اعتماد النتائج تلقائياً بعد الاستيراد</small>
            </div>
            <div class="full-width form-actions">
                <button type="submit" class="btn-primary">✅ بدء الاستيراد</button>
                <a href="index.php?page=import_results" class="btn-secondary">← رجوع</a>
            </div>
        </form>
    </div>
    <?php
    return;
}

// الصفحة الرئيسية
?>
<div class="page-header">
    <h1>استيراد النتائج من ملف</h1>
    <div class="actions-bar">
        <a href="index.php?page=import_results&action=download_template" class="btn-secondary">📥 تحميل قالب CSV</a>
    </div>
</div>

<?php if ($msg): ?>
<div class="alert alert-<?php echo (strpos($msg, 'خطأ') !== false || strpos($msg, 'فشل') !== false) ? 'danger' : 'success'; ?>" style="margin-bottom:16px;">
    <?php echo htmlspecialchars($msg, ENT_QUOTES, 'UTF-8'); ?>
</div>
<?php endif; ?>

<?php if (!empty($errors)): ?>
<div class="alert alert-danger" style="margin-bottom:16px;">
    <strong>أخطاء:</strong>
    <ul style="margin-top:8px;">
        <?php foreach (array_slice($errors, 0, 10) as $err): ?>
        <li><?php echo htmlspecialchars($err, ENT_QUOTES, 'UTF-8'); ?></li>
        <?php endforeach; ?>
        <?php if (count($errors) > 10): ?>
        <li>... و <?php echo count($errors) - 10; ?> خطأ آخر</li>
        <?php endif; ?>
    </ul>
</div>
<?php endif; ?>

<?php if (!empty($warnings)): ?>
<div class="alert alert-warning" style="margin-bottom:16px;">
    <strong>تحذيرات:</strong>
    <ul style="margin-top:8px;">
        <?php foreach (array_slice($warnings, 0, 10) as $warn): ?>
        <li><?php echo htmlspecialchars($warn, ENT_QUOTES, 'UTF-8'); ?></li>
        <?php endforeach; ?>
        <?php if (count($warnings) > 10): ?>
        <li>... و <?php echo count($warnings) - 10; ?> تحذير آخر</li>
        <?php endif; ?>
    </ul>
</div>
<?php endif; ?>

<?php if ($importStats['total'] > 0): ?>
<div class="card" style="margin-bottom:16px;">
    <h3>تقرير الاستيراد</h3>
    <div style="display:grid;grid-template-columns:repeat(auto-fit, minmax(150px, 1fr));gap:16px;">
        <div style="text-align:center;padding:12px;background:var(--bg-secondary);border-radius:8px;">
            <div style="font-size:2rem;font-weight:bold;color:var(--primary);"><?php echo $importStats['total']; ?></div>
            <div style="color:var(--text-muted);">إجمالي الصفوف</div>
        </div>
        <div style="text-align:center;padding:12px;background:var(--bg-secondary);border-radius:8px;">
            <div style="font-size:2rem;font-weight:bold;color:var(--success);"><?php echo $importStats['imported']; ?></div>
            <div style="color:var(--text-muted);">تمت الإضافة</div>
        </div>
        <div style="text-align:center;padding:12px;background:var(--bg-secondary);border-radius:8px;">
            <div style="font-size:2rem;font-weight:bold;color:var(--info);"><?php echo $importStats['updated']; ?></div>
            <div style="color:var(--text-muted);">تم التحديث</div>
        </div>
        <div style="text-align:center;padding:12px;background:var(--bg-secondary);border-radius:8px;">
            <div style="font-size:2rem;font-weight:bold;color:var(--warning);"><?php echo $importStats['skipped']; ?></div>
            <div style="color:var(--text-muted);">تم التخطي</div>
        </div>
        <div style="text-align:center;padding:12px;background:var(--bg-secondary);border-radius:8px;">
            <div style="font-size:2rem;font-weight:bold;color:var(--danger);"><?php echo $importStats['failed']; ?></div>
            <div style="color:var(--text-muted);">فشل</div>
        </div>
    </div>
</div>
<?php endif; ?>

<div class="card" style="margin-bottom:16px;">
    <h3 style="margin-top:0;">صيغة الملف</h3>
    <p>الملف يجب أن يكون <strong>CSV</strong> بالأعمدة التالية:</p>
    <ul>
        <li><strong>order_number</strong> أو <strong>order_id</strong> — رقم الطلب (مطلوب)</li>
        <li><strong>test_code</strong> أو <strong>test_id</strong> — كود الفحص أو المعرف (مطلوب)</li>
        <li><strong>result_value</strong> أو <strong>value</strong> — قيمة النتيجة (مطلوب)</li>
        <li><strong>unit</strong> — الوحدة (اختياري)</li>
        <li><strong>flag</strong> — العلامة (N/L/H/C) (اختياري - سيتم تحديدها تلقائياً)</li>
        <li><strong>notes</strong> — ملاحظات (اختياري)</li>
    </ul>
    <details style="margin-top:12px;">
        <summary style="cursor:pointer;color:var(--primary);">📖 مثال على الملف</summary>
        <div style="margin-top:8px;padding:12px;background:var(--bg-secondary);border-radius:4px;">
            <pre style="margin:0;overflow-x:auto;"><code>order_number,test_code,result_value,unit,flag,notes
O1771140581,CBC_Hb,14.2,g/dL,N,
O1771140581,CBC_WBC,7.5,10^3/μL,N,
O1771140581,CBC_RBC,4.8,10^6/μL,N,</code></pre>
        </div>
    </details>
</div>

<div class="card">
    <h3 style="margin-top:0;">رفع الملف</h3>
    <form method="post" action="index.php?page=import_results&action=preview" enctype="multipart/form-data" class="form-grid">
        <div class="full-width">
            <label>اختر ملف CSV</label>
            <input type="file" name="csv_file" accept=".csv,.xlsx,.xls" required>
            <small style="color:var(--text-muted);display:block;margin-top:4px;">
                الصيغ المدعومة: CSV, Excel (XLSX/XLS)
            </small>
        </div>
        <div class="full-width form-actions">
            <button type="submit" class="btn-primary">👁️ معاينة البيانات</button>
            <a href="index.php?page=import_results&action=download_template" class="btn-secondary">📥 تحميل قالب</a>
        </div>
    </form>
</div>

<div class="card" style="margin-top:16px;">
    <h3 style="margin-top:0;">💡 نصائح</h3>
    <ul>
        <li>استخدم <strong>معاينة البيانات</strong> قبل الاستيراد للتحقق من صحة البيانات</li>
        <li>تأكد من أن أرقام الطلبات وأكواد الفحوصات موجودة في النظام</li>
        <li>يمكنك تحميل قالب CSV لمعرفة الصيغة المطلوبة</li>
        <li>النتائج الموجودة سيتم تحديثها تلقائياً (ما لم تختر "تخطي الموجودة")</li>
        <li>العلامات (flags) سيتم تحديدها تلقائياً بناءً على المدى المرجعي</li>
    </ul>
</div>
