<?php
/**
 * Alert & Notification Service
 * خدمة التنبيهات والإنذارات
 * 
 * @author Almanara GPS Team
 * @version 1.0
 */

require_once __DIR__ . '/config.php';

class AlertService {
    private $conn;
    private $userId;
    
    public function __construct($connection, $userId) {
        $this->conn = $connection;
        $this->userId = $userId;
        $this->initializeTables();
    }
    
    /**
     * تهيئة الجداول المطلوبة
     */
    private function initializeTables() {
        try {
            // جدول التنبيهات
            $this->conn->exec("
                CREATE TABLE IF NOT EXISTS `alerts` (
                    `id` int(11) NOT NULL AUTO_INCREMENT,
                    `user_id` int(11) NOT NULL,
                    `device_id` varchar(255) NOT NULL,
                    `alert_type` enum('connection_lost', 'low_battery', 'geofence_enter', 'geofence_exit', 'high_speed', 'gps_disabled', 'gps_enabled', 'internet_disconnected', 'internet_connected', 'internet_manually_disabled', 'device_shutdown', 'permission_denied', 'permission_granted', 'custom') NOT NULL,
                    `title` varchar(255) NOT NULL,
                    `message` text NOT NULL,
                    `is_read` tinyint(1) DEFAULT 0,
                    `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
                    PRIMARY KEY (`id`),
                    KEY `idx_user_id` (`user_id`),
                    KEY `idx_device_id` (`device_id`),
                    KEY `idx_is_read` (`is_read`),
                    KEY `idx_created_at` (`created_at`)
                ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
            ");
            
            // ✅ إضافة عمود user_id إذا كان الجدول موجوداً بدون هذا العمود
            try {
                $checkColumn = $this->conn->query("SHOW COLUMNS FROM `alerts` LIKE 'user_id'");
                if ($checkColumn->rowCount() == 0) {
                    // العمود غير موجود، نضيفه
                    $this->conn->exec("ALTER TABLE `alerts` ADD COLUMN `user_id` int(11) NOT NULL DEFAULT 1 AFTER `id`");
                    $this->conn->exec("ALTER TABLE `alerts` ADD INDEX `idx_user_id` (`user_id`)");
                    error_log("✅ تم إضافة عمود user_id إلى جدول alerts");
                }
            } catch (PDOException $e) {
                error_log("⚠️ خطأ في التحقق من/إضافة عمود user_id: " . $e->getMessage());
            }
            
            // جدول إعدادات التنبيهات للمستخدم
            $this->conn->exec("
                CREATE TABLE IF NOT EXISTS `alert_settings` (
                    `id` int(11) NOT NULL AUTO_INCREMENT,
                    `user_id` int(11) NOT NULL,
                    `device_id` varchar(255) DEFAULT NULL,
                    `alert_type` enum('connection_lost', 'low_battery', 'geofence_enter', 'geofence_exit', 'high_speed', 'gps_disabled', 'gps_enabled', 'internet_disconnected', 'internet_connected', 'internet_manually_disabled', 'device_shutdown', 'permission_denied', 'permission_granted') NOT NULL,
                    `is_enabled` tinyint(1) DEFAULT 1,
                    `threshold_value` varchar(255) DEFAULT NULL,
                    `notification_email` varchar(255) DEFAULT NULL,
                    PRIMARY KEY (`id`),
                    UNIQUE KEY `unique_user_device_alert` (`user_id`, `device_id`, `alert_type`),
                    KEY `idx_user_id` (`user_id`)
                ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
            ");
        } catch (PDOException $e) {
            error_log("❌ خطأ في تهيئة جداول التنبيهات: " . $e->getMessage());
        }
    }
    
    /**
     * إنشاء تنبيه جديد
     */
    public function createAlert($deviceId, $alertType, $title, $message, $metadata = []) {
        try {
            $stmt = $this->conn->prepare("
                INSERT INTO alerts (user_id, device_id, alert_type, title, message)
                VALUES (?, ?, ?, ?, ?)
            ");
            
            $stmt->execute([
                $this->userId,
                $deviceId,
                $alertType,
                $title,
                $message
            ]);
            
            $alertId = $this->conn->lastInsertId();
            
            // إرسال إشعار إذا كان مفعلاً
            $this->sendNotification($deviceId, $alertType, $title, $message);
            
            return $alertId;
        } catch (PDOException $e) {
            error_log("❌ خطأ في إنشاء التنبيه: " . $e->getMessage());
            return false;
        }
    }
    
    /**
     * جلب التنبيهات غير المقروءة
     */
    public function getUnreadAlerts($limit = 50) {
        try {
            $stmt = $this->conn->prepare("
                SELECT a.*, d.device_name
                FROM alerts a
                LEFT JOIN devices d ON a.device_id = d.device_id
                WHERE a.user_id = ? AND a.is_read = 0
                ORDER BY a.created_at DESC
                LIMIT ?
            ");
            
            $stmt->execute([$this->userId, $limit]);
            return $stmt->fetchAll(PDO::FETCH_ASSOC);
        } catch (PDOException $e) {
            error_log("❌ خطأ في جلب التنبيهات: " . $e->getMessage());
            return [];
        }
    }
    
    /**
     * تحديد التنبيه كمقروء
     */
    public function markAsRead($alertId) {
        try {
            $stmt = $this->conn->prepare("
                UPDATE alerts SET is_read = 1 WHERE id = ? AND user_id = ?
            ");
            return $stmt->execute([$alertId, $this->userId]);
        } catch (PDOException $e) {
            error_log("❌ خطأ في تحديد التنبيه كمقروء: " . $e->getMessage());
            return false;
        }
    }
    
    /**
     * تحديد جميع التنبيهات كمقروءة
     */
    public function markAllAsRead() {
        try {
            $stmt = $this->conn->prepare("
                UPDATE alerts SET is_read = 1 WHERE user_id = ? AND is_read = 0
            ");
            $stmt->execute([$this->userId]);
            return $stmt->rowCount(); // عدد التنبيهات التي تم تحديثها
        } catch (PDOException $e) {
            error_log("❌ خطأ في تحديد جميع التنبيهات كمقروءة: " . $e->getMessage());
            return false;
        }
    }
    
    /**
     * التحقق من التنبيهات للأجهزة
     */
    public function checkDeviceAlerts($deviceId, $deviceData) {
        // التحقق من انقطاع الاتصال (يعمل مع Firebase و MySQL)
        $lastSeen = isset($deviceData['last_seen_timestamp']) ? $deviceData['last_seen_timestamp'] : 0;
        $timeSinceLastSeen = time() - $lastSeen;
        
        // تنبيه انقطاع الاتصال (أكثر من دقيقتين)
        if ($timeSinceLastSeen > 120) {
            $this->checkAndCreateAlert($deviceId, 'connection_lost', 
                'انقطاع الاتصال', 
                "انقطع الاتصال مع الجهاز {$deviceData['device_name']} منذ " . round($timeSinceLastSeen / 60) . " دقيقة");
        }
        
        // التحقق من البطارية
        if (isset($deviceData['battery']) && $deviceData['battery'] < 20) {
            $this->checkAndCreateAlert($deviceId, 'low_battery',
                'بطارية منخفضة',
                "بطارية الجهاز {$deviceData['device_name']} منخفضة: {$deviceData['battery']}%");
        }
        
        // التحقق من السرعة العالية
        if (isset($deviceData['speed']) && $deviceData['speed'] > 120) {
            $this->checkAndCreateAlert($deviceId, 'high_speed',
                'سرعة عالية',
                "الجهاز {$deviceData['device_name']} يسير بسرعة عالية: {$deviceData['speed']} كم/س");
        }
    }
    
    /**
     * التحقق وإنشاء التنبيه إذا كان مفعلاً
     */
    private function checkAndCreateAlert($deviceId, $alertType, $title, $message) {
        // التحقق من إعدادات التنبيه
        if (!$this->isAlertEnabled($deviceId, $alertType)) {
            return false;
        }
        
        // التحقق من عدم وجود تنبيه مشابه حديث
        if ($this->hasRecentAlert($deviceId, $alertType)) {
            return false;
        }
        
        return $this->createAlert($deviceId, $alertType, $title, $message);
    }
    
    /**
     * التحقق من تفعيل التنبيه
     */
    private function isAlertEnabled($deviceId, $alertType) {
        try {
            $stmt = $this->conn->prepare("
                SELECT is_enabled FROM alert_settings
                WHERE user_id = ? AND (device_id = ? OR device_id IS NULL) AND alert_type = ?
                ORDER BY device_id DESC
                LIMIT 1
            ");
            $stmt->execute([$this->userId, $deviceId, $alertType]);
            $result = $stmt->fetch(PDO::FETCH_ASSOC);
            return $result ? (bool)$result['is_enabled'] : true; // افتراضياً مفعّل
        } catch (PDOException $e) {
            return true; // في حالة الخطأ، نفعّل التنبيه
        }
    }
    
    /**
     * التحقق من وجود تنبيه حديث
     */
    private function hasRecentAlert($deviceId, $alertType, $minutes = 5) {
        try {
            $stmt = $this->conn->prepare("
                SELECT COUNT(*) as count FROM alerts
                WHERE user_id = ? AND device_id = ? AND alert_type = ?
                AND created_at > DATE_SUB(NOW(), INTERVAL ? MINUTE)
            ");
            $stmt->execute([$this->userId, $deviceId, $alertType, $minutes]);
            $result = $stmt->fetch(PDO::FETCH_ASSOC);
            return $result['count'] > 0;
        } catch (PDOException $e) {
            return false;
        }
    }
    
    /**
     * إرسال إشعار (يمكن توسيعه ليشمل البريد الإلكتروني، Push notifications، إلخ)
     */
    private function sendNotification($deviceId, $alertType, $title, $message) {
        // يمكن إضافة إرسال بريد إلكتروني هنا
        // يمكن إضافة Push notifications هنا
        error_log("📢 تنبيه: [$alertType] $title - $message");
    }
}

