# دراسة نظام الإشعارات والرسائل في Header

## 📋 نظرة عامة

هذا الملف يوضح كيفية عمل نظام الإشعارات الرقمية (Badge Count) للرسائل والإشعارات في header.

---

## 🔔 نظام الإشعارات (Notifications)

### جدول قاعدة البيانات: `notifications`

```sql
CREATE TABLE `notifications` (
  `id` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  `type` varchar(50) NOT NULL,
  `title` varchar(255) NOT NULL,
  `message` text NOT NULL,
  `related_id` int(11) DEFAULT NULL,
  `related_type` varchar(50) DEFAULT NULL,
  `priority` enum('low','medium','high','urgent') DEFAULT 'medium',
  `due_date` date DEFAULT NULL,
  `is_read` tinyint(1) DEFAULT 0,  -- ⭐ حقل مهم: 0 = غير مقروء، 1 = مقروء
  `created_at` timestamp NOT NULL DEFAULT current_timestamp()
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
```

### الاستعلام المستخدم في header.php

```php
// جلب عدد الإشعارات غير المقروءة
$notifications_query = "SELECT COUNT(*) as unread_count 
                        FROM notifications 
                        WHERE user_id = ? AND is_read = 0";
$notifications_stmt = $connect->prepare($notifications_query);
$notifications_stmt->execute([$user_code]);
$notifications_result = $notifications_stmt->fetch(PDO::FETCH_ASSOC);
$unread_notifications = $notifications_result['unread_count'] ?? 0;
```

### عرض العدد في Header (React)

```javascript
<Badge count={window.unreadNotifications || 0} overflowCount={99}>
  <Button 
    shape="circle" 
    icon={<i className="fa-sharp fa-solid fa-bell"></i>} 
    onClick={() => window.location.href = window.notificationsUrl}
  />
</Badge>
```

**المتغير JavaScript:** `window.unreadNotifications`

---

## ✉️ نظام الرسائل (Messages)

### جدول قاعدة البيانات: `messages`

```sql
CREATE TABLE `messages` (
  `id` int(11) NOT NULL,
  `sender_id` int(11) NOT NULL,
  `receiver_id` int(11) NOT NULL,  -- ⭐ ID المستقبل
  `text` text DEFAULT NULL,
  `image_url` varchar(255) DEFAULT NULL,
  `audio_url` varchar(255) DEFAULT NULL,
  `video_url` varchar(255) DEFAULT NULL,
  `url` varchar(255) NOT NULL,
  `reply_to_message_id` int(11) DEFAULT NULL,
  `is_deleted` tinyint(1) DEFAULT 0,  -- حذف الرسالة
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  `property_url` text DEFAULT NULL,
  `document_url` varchar(255) DEFAULT NULL,
  `is_edited` tinyint(1) DEFAULT 0,
  `edited_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
```

### ⚠️ ملاحظة مهمة

**جدول `messages` لا يحتوي على حقل `is_read`!**

هذا يعني أننا **لا نستطيع** تحديد الرسائل غير المقروءة مباشرة من هذا الجدول.

### الحلول الممكنة:

#### الحل 1: استخدام جدول منفصل لتتبع قراءة الرسائل

قد يكون هناك جدول منفصل مثل `message_reads` أو `message_status`، لكنه غير موجود حالياً في المخطط.

#### الحل 2: إضافة حقل `is_read` إلى جدول `messages`

```sql
ALTER TABLE `messages` 
ADD COLUMN `is_read` tinyint(1) DEFAULT 0 COMMENT '0=غير مقروء، 1=مقروء';
```

**ملاحظة:** هذا الحل قد لا يكون مناسباً إذا كان هناك عدة مستقبلين للرسالة نفسها.

#### الحل 3: استخدام جدول `message_reads` (الأفضل)

```sql
CREATE TABLE `message_reads` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `message_id` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  `read_at` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  UNIQUE KEY `unique_read` (`message_id`, `user_id`),
  FOREIGN KEY (`message_id`) REFERENCES `messages`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
```

**الاستعلام:**
```sql
SELECT COUNT(DISTINCT m.id) as unread_count
FROM messages m
LEFT JOIN message_reads mr ON m.id = mr.message_id AND mr.user_id = ?
WHERE m.receiver_id = ? 
  AND m.is_deleted = 0
  AND mr.id IS NULL;
```

#### الحل 4: حساب الرسائل الجديدة (غير مقروءة) بناءً على آخر زيارة

استخدام `last_seen_at` في جدول `users`:

```sql
SELECT COUNT(*) as unread_count
FROM messages
WHERE receiver_id = ?
  AND is_deleted = 0
  AND created_at > (
    SELECT last_seen_at FROM users WHERE usercode = ?
  );
```

---

## 📊 الوضع الحالي في header.php

### ✅ الإشعارات (Notifications)
- ✅ يتم جلب العدد من جدول `notifications`
- ✅ يتم عرضه على Badge
- ✅ يعمل بشكل صحيح

### ❌ الرسائل (Messages)
- ❌ لا يتم جلب عدد الرسائل غير المقروءة
- ❌ لا يوجد Badge على زر الرسائل
- ⚠️ جدول `messages` لا يحتوي على حقل `is_read`
- ⚠️ في `get_messages.php` يتم تعيين `unread_count = 0` بشكل ثابت (لا يتم الحساب الفعلي)

---

## 🔧 التوصيات

### 1. للإشعارات (Notifications)
**الوضع الحالي جيد ولا يحتاج تغيير.**

### 2. للرسائل (Messages)

#### الخيار A: إضافة حقل `is_read` (بسيط)
إذا كانت الرسائل دائماً لمستقبل واحد فقط:

```sql
ALTER TABLE `messages` 
ADD COLUMN `is_read` tinyint(1) DEFAULT 0;

-- الاستعلام:
SELECT COUNT(*) as unread_count
FROM messages
WHERE receiver_id = ? 
  AND is_read = 0 
  AND is_deleted = 0;
```

#### الخيار B: إنشاء جدول `message_reads` (موصى به)
إذا كانت الرسائل قد تكون لمستقبلين متعددين:

```sql
-- إنشاء الجدول
CREATE TABLE `message_reads` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `message_id` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  `read_at` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  UNIQUE KEY `unique_read` (`message_id`, `user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- الاستعلام:
SELECT COUNT(DISTINCT m.id) as unread_count
FROM messages m
LEFT JOIN message_reads mr ON m.id = mr.message_id AND mr.user_id = ?
WHERE m.receiver_id = ? 
  AND m.is_deleted = 0
  AND mr.id IS NULL;
```

---

## 📝 ملخص

1. **الإشعارات:** نظام يعمل بشكل صحيح ✅
   - جدول `notifications` يحتوي على حقل `is_read`
   - يتم جلب العدد في header.php
   - يتم عرضه على Badge في Header

2. **الرسائل:** يحتاج إضافة آلية لتتبع القراءة ⚠️
   - جدول `messages` لا يحتوي على حقل `is_read`
   - في ملف `get_messages.php` يتم تعيين `unread_count = 0` بشكل ثابت (لا يتم الحساب)
   - في ملف `messages.php` يتم عرض `unread_count` لكنه دائماً 0
   - زر الرسائل في header لا يحتوي على Badge حالياً
   - **الخلاصة:** نظام الرسائل غير المقروءة غير مطبق حالياً

3. **التوصية:** استخدام جدول `message_reads` للأفضلية والأمان

---

## 🔍 ملاحظات إضافية

### في messages.php و get_messages.php:
- يتم استخدام API endpoint: `../api/messages/get_messages.php`
- في ملف API (السطر 111)، يتم تعيين `unread_count` إلى `0` بشكل ثابت:
  ```sql
  SELECT DISTINCT 
      ...
      0 as unread_count  -- ⚠️ قيمة ثابتة!
  FROM messages m
  ```
- **النتيجة:** النظام الحالي لا يحسب الرسائل غير المقروءة فعلياً، بل يعرض 0 دائماً
- في `messages.php` يتم عرض `unread_count` لكنه دائماً يكون 0 لأن API يعيد 0

---

## 🔗 الملفات ذات الصلة

- `users/office/includes/header.php` - Header component مع Badge
- `users/office/includes/header_component.php` - HTML Header component
- `users/office/utilities/notifications.php` - صفحة الإشعارات
- `users/office/utilities/messages.php` - صفحة الرسائل
- `users/office/api/messages/get_messages.php` - API endpoint للرسائل (يحتاج مراجعة)
- `sql/faradjwb_farsak.sql` - مخطط قاعدة البيانات

