<?php
/**
 * إعداد مجدول تحديث الكاش
 * يمكن تشغيله لإعداد مهام تحديث الكاش التلقائية
 */

require_once 'config.php';

class CacheSchedulerSetup {
    private $conn;
    
    public function __construct() {
        global $conn;
        $this->conn = $conn;
    }
    
    /**
     * إنشاء جدول مهام الكاش المجدولة
     */
    public function createSchedulerTable() {
        try {
            $sql = "
                CREATE TABLE IF NOT EXISTS cache_scheduler (
                    id INT AUTO_INCREMENT PRIMARY KEY,
                    task_name VARCHAR(100) NOT NULL UNIQUE,
                    last_run DATETIME NULL,
                    next_run DATETIME NULL,
                    interval_hours INT NOT NULL DEFAULT 24,
                    is_active BOOLEAN DEFAULT TRUE,
                    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
                    INDEX idx_next_run (next_run),
                    INDEX idx_active (is_active)
                ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
            ";
            
            $this->conn->exec($sql);
            
            // إدراج المهام الافتراضية
            $defaultTasks = [
                ['update_old_cache', 24],    // كل 24 ساعة
                ['cleanup_cache', 168],      // كل أسبوع
                ['update_stats', 6]          // كل 6 ساعات
            ];
            
            $stmt = $this->conn->prepare("
                INSERT IGNORE INTO cache_scheduler (task_name, interval_hours, next_run)
                VALUES (?, ?, DATE_ADD(NOW(), INTERVAL ? HOUR))
            ");
            
            foreach ($defaultTasks as list($taskName, $intervalHours)) {
                $stmt->execute([$taskName, $intervalHours, $intervalHours]);
            }
            
            return true;
            
        } catch (Exception $e) {
            error_log("خطأ في إنشاء جدول المجدول: " . $e->getMessage());
            return false;
        }
    }
    
    /**
     * تشغيل المهام المستحقة
     */
    public function runScheduledTasks() {
        try {
            // جلب المهام المستحقة للتشغيل
            $stmt = $this->conn->prepare("
                SELECT id, task_name, interval_hours 
                FROM cache_scheduler 
                WHERE is_active = TRUE 
                  AND (next_run IS NULL OR next_run <= NOW())
                ORDER BY next_run ASC
            ");
            $stmt->execute();
            $tasks = $stmt->fetchAll(PDO::FETCH_ASSOC);
            
            $tasksRun = 0;
            
            foreach ($tasks as $task) {
                $this->runTask($task['task_name']);
                
                // تحديث أوقات التشغيل
                $updateStmt = $this->conn->prepare("
                    UPDATE cache_scheduler 
                    SET last_run = NOW(), 
                        next_run = DATE_ADD(NOW(), INTERVAL ? HOUR) 
                    WHERE id = ?
                ");
                $updateStmt->execute([$task['interval_hours'], $task['id']]);
                
                $tasksRun++;
            }
            
            return $tasksRun;
            
        } catch (Exception $e) {
            error_log("خطأ في تشغيل المهام المجدولة: " . $e->getMessage());
            return 0;
        }
    }
    
    /**
     * تشغيل مهمة محددة
     */
    private function runTask($taskName) {
        require_once 'cache_background_updater.php';
        $updater = new CacheBackgroundUpdater();
        
        switch ($taskName) {
            case 'update_old_cache':
                $updater->updateOldCache(168); // أسبوع
                break;
                
            case 'cleanup_cache':
                $updater->cleanupOldCache(90); // 3 شهور
                break;
                
            case 'update_stats':
                $updater->updateCacheStats();
                break;
                
            default:
                error_log("مهمة غير معروفة: {$taskName}");
        }
    }
    
    /**
     * الحصول على حالة المجدول
     */
    public function getSchedulerStatus() {
        try {
            $stmt = $this->conn->prepare("
                SELECT task_name, last_run, next_run, interval_hours, is_active
                FROM cache_scheduler 
                ORDER BY next_run ASC
            ");
            $stmt->execute();
            $tasks = $stmt->fetchAll(PDO::FETCH_ASSOC);

            return $tasks;
            
        } catch (Exception $e) {
            error_log("خطأ في جلب حالة المجدول: " . $e->getMessage());
            return [];
        }
    }
    
    /**
     * إنشاء ملف Windows Task Scheduler
     */
    public function createWindowsTask() {
        $taskXml = '<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
  <RegistrationInfo>
    <Description>GPS Cache Background Updater</Description>
  </RegistrationInfo>
  <Triggers>
    <TimeTrigger>
      <Repetition>
        <Interval>PT1H</Interval>
      </Repetition>
      <StartBoundary>2024-01-01T00:00:00</StartBoundary>
      <Enabled>true</Enabled>
    </TimeTrigger>
  </Triggers>
  <Principals>
    <Principal id="Author">
      <LogonType>InteractiveToken</LogonType>
      <RunLevel>LeastPrivilege</RunLevel>
    </Principal>
  </Principals>
  <Settings>
    <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
    <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
    <StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
    <AllowHardTerminate>true</AllowHardTerminate>
    <StartWhenAvailable>false</StartWhenAvailable>
    <RunOnlyIfNetworkAvailable>true</RunOnlyIfNetworkAvailable>
    <IdleSettings>
      <StopOnIdleEnd>true</StopOnIdleEnd>
      <RestartOnIdle>false</RestartOnIdle>
    </IdleSettings>
    <AllowStartOnDemand>true</AllowStartOnDemand>
    <Enabled>true</Enabled>
    <Hidden>false</Hidden>
    <RunOnlyIfIdle>false</RunOnlyIfIdle>
    <WakeToRun>false</WakeToRun>
    <ExecutionTimeLimit>PT1H</ExecutionTimeLimit>
    <Priority>7</Priority>
  </Settings>
  <Actions>
    <Exec>
      <Command>php</Command>
      <Arguments>"' . __DIR__ . '\\cache_scheduler_runner.php"</Arguments>
      <WorkingDirectory>' . __DIR__ . '</WorkingDirectory>
    </Exec>
  </Actions>
</Task>';
        
        file_put_contents(__DIR__ . '/gps_cache_task.xml', $taskXml);
        
        return "تم إنشاء ملف المهمة: gps_cache_task.xml\nلتفعيل المهمة، قم بتشغيل الأمر التالي في Command Prompt كمدير:\nschtasks /create /tn \"GPS Cache Updater\" /xml \"" . __DIR__ . "\\gps_cache_task.xml\"";
    }
}

// تشغيل الإعداد إذا تم استدعاء الملف مباشرة
if (php_sapi_name() === 'cli' || isset($_GET['setup'])) {
    $scheduler = new CacheSchedulerSetup();
    
    if (isset($_GET['action'])) {
        switch ($_GET['action']) {
            case 'create_table':
                $result = $scheduler->createSchedulerTable();
                echo json_encode(['status' => $result ? 'success' : 'error', 'message' => $result ? 'تم إنشاء الجدول بنجاح' : 'فشل في إنشاء الجدول']);
                break;
                
            case 'run_tasks':
                $tasksRun = $scheduler->runScheduledTasks();
                echo json_encode(['status' => 'success', 'tasks_run' => $tasksRun, 'message' => "تم تشغيل {$tasksRun} مهمة"]);
                break;
                
            case 'status':
                $status = $scheduler->getSchedulerStatus();
                echo json_encode(['status' => 'success', 'tasks' => $status]);
                break;
                
            case 'create_windows_task':
                $instructions = $scheduler->createWindowsTask();
                echo json_encode(['status' => 'success', 'instructions' => $instructions]);
                break;
                
            default:
                echo json_encode(['status' => 'error', 'message' => 'إجراء غير معروف']);
        }
    } else {
        // إعداد كامل
        $scheduler->createSchedulerTable();
        $tasksRun = $scheduler->runScheduledTasks();
        
        if (php_sapi_name() === 'cli') {
            echo "تم إعداد مجدول الكاش بنجاح\nتم تشغيل {$tasksRun} مهمة\n";
        } else {
            echo json_encode(['status' => 'success', 'message' => 'تم إعداد مجدول الكاش بنجاح', 'tasks_run' => $tasksRun]);
        }
    }
}
?>