<?php
/**
 * نظام إدارة طلبات الفحص
 * مع Prepared Statements ومعالجة الأخطاء والحفظ المحلي
 */

// =============================================
// 1. إعدادات قاعدة البيانات
// =============================================
define('DB_HOST', 'localhost');
define('DB_NAME', 'digitals_autotester_db');
define('DB_USER', 'root');
define('DB_PASS', '');
define('TIMEZONE', 'Asia/Riyadh');
define('LOCAL_STORAGE_FILE', __DIR__ . '/pending_requests.json');

date_default_timezone_set(TIMEZONE);

// =============================================
// 2. فئة التعامل مع قاعدة البيانات
// =============================================
class Database {
    private static $instance = null;
    private $connection;
    private $connected = false;
    
    private function __construct() {
        $this->connect();
    }
    
    public static function getInstance() {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance;
    }
    
    private function connect() {
        try {
            $this->connection = new PDO(
                "mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=utf8mb4",
                DB_USER,
                DB_PASS,
                [
                    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
                    PDO::ATTR_EMULATE_PREPARES => false
                ]
            );
            $this->connected = true;
            return true;
        } catch (PDOException $e) {
            $this->connected = false;
            error_log("Database connection failed: " . $e->getMessage());
            return false;
        }
    }
    
    public function isConnected() {
        return $this->connected;
    }
    
    public function getConnection() {
        return $this->connection;
    }
    
    public function prepare($sql) {
        if (!$this->connected) {
            throw new Exception("No database connection");
        }
        return $this->connection->prepare($sql);
    }
    
    public function beginTransaction() {
        if ($this->connected) {
            $this->connection->beginTransaction();
        }
    }
    
    public function commit() {
        if ($this->connected) {
            $this->connection->commit();
        }
    }
    
    public function rollback() {
        if ($this->connected) {
            $this->connection->rollback();
        }
    }
}

// =============================================
// 3. فئة معالجة الطلبات
// =============================================
class RequestManager {
    private $db;
    private $requestId;
    private $errors = [];
    
    public function __construct() {
        $this->db = Database::getInstance();
        $this->requestId = $this->generateRequestId();
    }
    
    private function generateRequestId() {
        return 'REQ-' . round(microtime(true) * 1000) . '-' . rand(100, 999);
    }
    
    public function getRequestId() {
        return $this->requestId;
    }
    
    /**
     * تنظيف وتحقق من صحة التاريخ والوقت - حل مشكلة datetime
     */
    private function validateDateTime($datetime, $fieldName = 'datetime') {
        // إذا كانت القيمة فارغة أو null
        if (empty($datetime) || $datetime === '') {
            return null;
        }
        
        // إزالة المسافات الزائدة
        $datetime = trim($datetime);
        
        // قائمة التنسيقات المقبولة
        $formats = [
            'Y-m-d H:i:s',
            'Y-m-d H:i',
            'Y-m-d',
            'Y/m/d H:i:s',
            'Y/m/d H:i',
            'Y/m/d',
            'd-m-Y H:i:s',
            'd-m-Y H:i',
            'd-m-Y',
            'd/m/Y H:i:s',
            'd/m/Y H:i',
            'd/m/Y'
        ];
        
        foreach ($formats as $format) {
            $date = DateTime::createFromFormat($format, $datetime);
            if ($date && $date->format($format) === $datetime) {
                return $date->format('Y-m-d H:i:s');
            }
        }
        
        $this->errors[] = "حقل $fieldName: تنسيق التاريخ غير صالح ('$datetime')";
        return null;
    }
    
    /**
     * تنظيف المدخلات النصية
     */
    private function sanitizeString($input) {
        if ($input === null || $input === '') {
            return null;
        }
        return trim(htmlspecialchars(strip_tags($input)));
    }
    
    /**
     * التحقق من صحة البريد الإلكتروني
     */
    private function validateEmail($email) {
        if (empty($email)) {
            return null;
        }
        $email = filter_var(trim($email), FILTER_SANITIZE_EMAIL);
        if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
            return $email;
        }
        $this->errors[] = "البريد الإلكتروني غير صالح: $email";
        return null;
    }
    
    /**
     * التحقق من صحة رقم الجوال
     */
    private function validatePhone($phone) {
        if (empty($phone)) {
            return null;
        }
        $phone = preg_replace('/[^0-9+]/', '', $phone);
        if (preg_match('/^(\+966|0)?5[0-9]{8}$/', $phone)) {
            return $phone;
        }
        $this->errors[] = "رقم الجوال غير صالح: $phone";
        return null;
    }
    
    /**
     * حفظ الطلب في قاعدة البيانات باستخدام Prepared Statement
     */
    public function saveToDatabase($data) {
        if (!$this->db->isConnected()) {
            throw new Exception("لا يوجد اتصال بقاعدة البيانات");
        }
        
        try {
            $this->db->beginTransaction();
            
            // تنظيف وتحقق من صحة البيانات
            $cleanedData = [
                'request_number' => $this->requestId,
                'customer_name' => $this->sanitizeString($data['customer_name'] ?? null),
                'customer_phone' => $this->validatePhone($data['customer_phone'] ?? null),
                'customer_email' => $this->validateEmail($data['customer_email'] ?? null),
                'vehicle_type' => $this->sanitizeString($data['vehicle_type'] ?? null),
                'vehicle_model' => $this->sanitizeString($data['vehicle_model'] ?? null),
                'vehicle_year' => !empty($data['vehicle_year']) ? (int)$data['vehicle_year'] : null,
                'plate_number' => $this->sanitizeString($data['plate_number'] ?? null),
                'inspection_type' => $this->sanitizeString($data['inspection_type'] ?? null),
                'appointment_date' => $this->validateDateTime($data['appointment_date'] ?? null, 'تاريخ الموعد'),
                'appointment_time' => $this->validateDateTime($data['appointment_time'] ?? null, 'وقت الموعد'),
                'center_id' => !empty($data['center_id']) ? (int)$data['center_id'] : null,
                'notes' => $this->sanitizeString($data['notes'] ?? null),
                'status' => 'pending',
                'created_at' => date('Y-m-d H:i:s'),
                'updated_at' => date('Y-m-d H:i:s')
            ];
            
            // التحقق من وجود أخطاء في التحقق
            if (!empty($this->errors)) {
                throw new Exception("أخطاء في التحقق من البيانات: " . implode(', ', $this->errors));
            }
            
            // بناء استعلام SQL باستخدام Prepared Statement
            $sql = "INSERT INTO inspection_requests_new (
                request_number,
                customer_name,
                customer_phone,
                customer_email,
                vehicle_type,
                vehicle_model,
                vehicle_year,
                plate_number,
                inspection_type,
                appointment_date,
                appointment_time,
                center_id,
                notes,
                status,
                created_at,
                updated_at
            ) VALUES (
                :request_number,
                :customer_name,
                :customer_phone,
                :customer_email,
                :vehicle_type,
                :vehicle_model,
                :vehicle_year,
                :plate_number,
                :inspection_type,
                :appointment_date,
                :appointment_time,
                :center_id,
                :notes,
                :status,
                :created_at,
                :updated_at
            )";
            
            $stmt = $this->db->prepare($sql);
            
            // تنفيذ الاستعلام مع ربط المتغيرات
            $stmt->execute([
                ':request_number' => $cleanedData['request_number'],
                ':customer_name' => $cleanedData['customer_name'],
                ':customer_phone' => $cleanedData['customer_phone'],
                ':customer_email' => $cleanedData['customer_email'],
                ':vehicle_type' => $cleanedData['vehicle_type'],
                ':vehicle_model' => $cleanedData['vehicle_model'],
                ':vehicle_year' => $cleanedData['vehicle_year'],
                ':plate_number' => $cleanedData['plate_number'],
                ':inspection_type' => $cleanedData['inspection_type'],
                ':appointment_date' => $cleanedData['appointment_date'],
                ':appointment_time' => $cleanedData['appointment_time'],
                ':center_id' => $cleanedData['center_id'],
                ':notes' => $cleanedData['notes'],
                ':status' => $cleanedData['status'],
                ':created_at' => $cleanedData['created_at'],
                ':updated_at' => $cleanedData['updated_at']
            ]);
            
            $insertId = $this->db->getConnection()->lastInsertId();
            
            $this->db->commit();
            
            return [
                'success' => true,
                'request_id' => $this->requestId,
                'database_id' => $insertId,
                'message' => '✅ تم حفظ الطلب بنجاح في قاعدة البيانات'
            ];
            
        } catch (PDOException $e) {
            $this->db->rollback();
            error_log("Database error: " . $e->getMessage());
            throw new Exception("خطأ في قاعدة البيانات: " . $e->getMessage());
        }
    }
    
    /**
     * حفظ الطلب محلياً
     */
    public function saveLocally($data) {
        $pendingRequests = $this->getLocalRequests();
        
        $localData = [
            'id' => $this->requestId,
            'data' => $data,
            'timestamp' => time(),
            'date' => date('Y-m-d H:i:s'),
            'attempts' => 0,
            'status' => 'pending'
        ];
        
        $pendingRequests[] = $localData;
        
        if (file_put_contents(LOCAL_STORAGE_FILE, json_encode($pendingRequests, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE))) {
            return [
                'success' => true,
                'request_id' => $this->requestId,
                'message' => '⚠️ تم حفظ الطلب محلياً، سيتم المزامنة تلقائياً عند استعادة الاتصال'
            ];
        }
        
        throw new Exception("فشل في حفظ الطلب محلياً");
    }
    
    /**
     * استرجاع الطلبات المحفوظة محلياً
     */
    private function getLocalRequests() {
        if (file_exists(LOCAL_STORAGE_FILE)) {
            $content = file_get_contents(LOCAL_STORAGE_FILE);
            $data = json_decode($content, true);
            return is_array($data) ? $data : [];
        }
        return [];
    }
    
    /**
     * مزامنة الطلبات المحفوظة محلياً مع قاعدة البيانات
     */
    public static function syncPendingRequests() {
        if (!file_exists(LOCAL_STORAGE_FILE)) {
            return ['success' => true, 'synced' => 0, 'message' => 'لا توجد طلبات معلقة'];
        }
        
        $db = Database::getInstance();
        if (!$db->isConnected()) {
            return ['success' => false, 'message' => 'لا يوجد اتصال بقاعدة البيانات للمزامنة'];
        }
        
        $pendingRequests = json_decode(file_get_contents(LOCAL_STORAGE_FILE), true);
        if (empty($pendingRequests)) {
            return ['success' => true, 'synced' => 0, 'message' => 'لا توجد طلبات معلقة'];
        }
        
        $failed = [];
        $successCount = 0;
        
        foreach ($pendingRequests as $request) {
            try {
                $manager = new self();
                // إعادة محاولة حفظ الطلب في قاعدة البيانات
                $result = $manager->saveToDatabase($request['data']);
                
                if ($result['success']) {
                    $successCount++;
                } else {
                    $failed[] = $request;
                }
            } catch (Exception $e) {
                error_log("Sync failed for request {$request['id']}: " . $e->getMessage());
                $failed[] = $request;
            }
        }
        
        // تحديث الملف المحلي بالطلبات الفاشلة فقط
        if (empty($failed)) {
            unlink(LOCAL_STORAGE_FILE);
        } else {
            file_put_contents(LOCAL_STORAGE_FILE, json_encode($failed, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
        }
        
        return [
            'success' => true,
            'synced' => $successCount,
            'failed' => count($failed),
            'message' => "✅ تمت مزامنة $successCount طلب بنجاح"
        ];
    }
    
    public function getErrors() {
        return $this->errors;
    }
}

// =============================================
// 4. فئة عرض الصفحة
// =============================================
class InspectionForm {
    private $requestManager;
    private $message = '';
    private $messageType = '';
    
    public function __construct() {
        $this->requestManager = new RequestManager();
    }
    
    public function handleRequest() {
        if ($_SERVER['REQUEST_METHOD'] === 'POST') {
            $this->processForm($_POST);
        }
    }
    
    private function processForm($data) {
        try {
            // محاولة الحفظ في قاعدة البيانات
            $result = $this->requestManager->saveToDatabase($data);
            $this->message = $result['message'];
            $this->messageType = 'success';
            
        } catch (Exception $e) {
            // إذا فشل الحفظ في قاعدة البيانات، احفظ محلياً
            try {
                $result = $this->requestManager->saveLocally($data);
                $this->message = $result['message'] . "<br>" . 
                                "📝 رقم الطلب: " . $result['request_id'] . "<br>" .
                                "🔄 سيتم المزامنة تلقائياً عند استعادة الاتصال";
                $this->messageType = 'warning';
            } catch (Exception $localError) {
                $this->message = "❌ فشل حفظ الطلب: " . $e->getMessage();
                $this->messageType = 'error';
            }
        }
    }
    
    public function render() {
        $db = Database::getInstance();
        $isConnected = $db->isConnected();
        $statusClass = $isConnected ? 'status-online' : 'status-offline';
        $statusText = $isConnected ? '🟢 متصل بقاعدة البيانات' : '🔴 غير متصل - سيتم الحفظ محلياً';
        ?>
        <!DOCTYPE html>
        <html lang="ar" dir="rtl">
        <head>
            <meta charset="UTF-8">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <title>نظام طلبات الفحص الفني</title>
            <style>
                * {
                    margin: 0;
                    padding: 0;
                    box-sizing: border-box;
                }
                
                body {
                    font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
                    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
                    min-height: 100vh;
                    padding: 20px;
                }
                
                .container {
                    max-width: 900px;
                    margin: 0 auto;
                    background: white;
                    border-radius: 15px;
                    box-shadow: 0 20px 60px rgba(0,0,0,0.3);
                    overflow: hidden;
                }
                
                .header {
                    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
                    color: white;
                    padding: 30px;
                    text-align: center;
                }
                
                .header h1 {
                    font-size: 28px;
                    margin-bottom: 10px;
                }
                
                .content {
                    padding: 30px;
                }
                
                .message {
                    padding: 15px;
                    border-radius: 8px;
                    margin-bottom: 20px;
                    animation: slideDown 0.5s ease;
                }
                
                @keyframes slideDown {
                    from {
                        opacity: 0;
                        transform: translateY(-20px);
                    }
                    to {
                        opacity: 1;
                        transform: translateY(0);
                    }
                }
                
                .message.success {
                    background: #d4edda;
                    color: #155724;
                    border: 1px solid #c3e6cb;
                }
                
                .message.warning {
                    background: #fff3cd;
                    color: #856404;
                    border: 1px solid #ffeaa7;
                }
                
                .message.error {
                    background: #f8d7da;
                    color: #721c24;
                    border: 1px solid #f5c6cb;
                }
                
                .form-group {
                    margin-bottom: 20px;
                }
                
                .form-group label {
                    display: block;
                    margin-bottom: 8px;
                    font-weight: 600;
                    color: #333;
                }
                
                .form-group label .required {
                    color: #dc3545;
                }
                
                .form-group input,
                .form-group select,
                .form-group textarea {
                    width: 100%;
                    padding: 12px;
                    border: 2px solid #e0e0e0;
                    border-radius: 8px;
                    font-size: 16px;
                    transition: all 0.3s;
                }
                
                .form-group input:focus,
                .form-group select:focus,
                .form-group textarea:focus {
                    outline: none;
                    border-color: #667eea;
                }
                
                .form-row {
                    display: grid;
                    grid-template-columns: 1fr 1fr;
                    gap: 20px;
                }
                
                button {
                    width: 100%;
                    padding: 14px;
                    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
                    color: white;
                    border: none;
                    border-radius: 8px;
                    font-size: 18px;
                    font-weight: 600;
                    cursor: pointer;
                    transition: transform 0.3s, box-shadow 0.3s;
                }
                
                button:hover {
                    transform: translateY(-2px);
                    box-shadow: 0 10px 20px rgba(0,0,0,0.2);
                }
                
                .status-badge {
                    display: inline-block;
                    padding: 6px 12px;
                    border-radius: 20px;
                    font-size: 13px;
                    font-weight: 600;
                    margin-top: 10px;
                }
                
                .status-online {
                    background: #28a745;
                    color: white;
                }
                
                .status-offline {
                    background: #dc3545;
                    color: white;
                }
                
                .footer {
                    background: #f8f9fa;
                    padding: 15px 30px;
                    text-align: center;
                    color: #666;
                    font-size: 14px;
                    border-top: 1px solid #e0e0e0;
                }
                
                @media (max-width: 768px) {
                    .form-row {
                        grid-template-columns: 1fr;
                        gap: 0;
                    }
                    
                    .content {
                        padding: 20px;
                    }
                }
            </style>
        </head>
        <body>
            <div class="container">
                <div class="header">
                    <h1>📋 نظام طلبات الفحص الفني</h1>
                    <p>تعبئة طلب فحص المركبات</p>
                    <div>
                        <span class="status-badge <?= $statusClass ?>"><?= $statusText ?></span>
                    </div>
                </div>
                
                <div class="content">
                    <?php if ($this->message): ?>
                        <div class="message <?= $this->messageType ?>">
                            <?= $this->message ?>
                        </div>
                    <?php endif; ?>
                    
                    <form method="POST" action="">
                        <div class="form-row">
                            <div class="form-group">
                                <label>👤 اسم العميل <span class="required">*</span></label>
                                <input type="text" name="customer_name" required placeholder="أدخل الاسم الكامل">
                            </div>
                            
                            <div class="form-group">
                                <label>📞 رقم الجوال <span class="required">*</span></label>
                                <input type="tel" name="customer_phone" required placeholder="05xxxxxxxx">
                            </div>
                        </div>
                        
                        <div class="form-group">
                            <label>📧 البريد الإلكتروني</label>
                            <input type="email" name="customer_email" placeholder="example@domain.com">
                        </div>
                        
                        <div class="form-row">
                            <div class="form-group">
                                <label>🚗 نوع المركبة <span class="required">*</span></label>
                                <select name="vehicle_type" required>
                                    <option value="">اختر نوع المركبة</option>
                                    <option value="سيارة">🚗 سيارة</option>
                                    <option value="شاحنة">🚚 شاحنة</option>
                                    <option value="حافلة">🚌 حافلة</option>
                                    <option value="دراجة نارية">🏍️ دراجة نارية</option>
                                </select>
                            </div>
                            
                            <div class="form-group">
                                <label>📅 موديل المركبة <span class="required">*</span></label>
                                <input type="number" name="vehicle_model" required min="1900" max="<?= date('Y') ?>" placeholder="مثال: 2020">
                            </div>
                        </div>
                        
                        <div class="form-row">
                            <div class="form-group">
                                <label>🔢 رقم اللوحة <span class="required">*</span></label>
                                <input type="text" name="plate_number" required placeholder="مثال: س ع ب 1234">
                            </div>
                            
                            <div class="form-group">
                                <label>🔧 نوع الفحص <span class="required">*</span></label>
                                <select name="inspection_type" required>
                                    <option value="">اختر نوع الفحص</option>
                                    <option value="دوري">🔄 فحص دوري</option>
                                    <option value="أول مرة">✨ فحص أول مرة</option>
                                    <option value="نقل ملكية">📄 فحص نقل ملكية</option>
                                </select>
                            </div>
                        </div>
                        
                        <div class="form-row">
                            <div class="form-group">
                                <label>📅 تاريخ الموعد</label>
                                <input type="date" name="appointment_date" placeholder="YYYY-MM-DD">
                                <small style="color: #666;">التنسيق: سنة-شهر-يوم</small>
                            </div>
                            
                            <div class="form-group">
                                <label>⏰ وقت الموعد</label>
                                <input type="time" name="appointment_time" placeholder="HH:MM">
                                <small style="color: #666;">التنسيق: ساعة:دقيقة</small>
                            </div>
                        </div>
                        
                        <div class="form-group">
                            <label>🏢 مركز الفحص</label>
                            <select name="center_id">
                                <option value="">اختر المركز</option>
                                <option value="1">🏢 مركز الرياض الرئيسي</option>
                                <option value="2">🏢 مركز جدة المركزي</option>
                                <option value="3">🏢 مركز الدمام النموذجي</option>
                            </select>
                        </div>
                        
                        <div class="form-group">
                            <label>📝 ملاحظات إضافية</label>
                            <textarea name="notes" rows="3" placeholder="أي ملاحظات إضافية تريد إضافتها..."></textarea>
                        </div>
                        
                        <button type="submit">📨 إرسال الطلب</button>
                    </form>
                </div>
                
                <div class="footer">
                    <p>نظام إدارة طلبات الفحص الفني | جميع الحقوق محفوظة © <?= date('Y') ?></p>
                </div>
            </div>
        </body>
        </html>
        <?php
    }
}

// =============================================
// 5. تنفيذ المزامنة التلقائية (عند تحميل الصفحة)
// =============================================
RequestManager::syncPendingRequests();

// =============================================
// 6. معالجة الطلب وعرض الصفحة
// =============================================
$form = new InspectionForm();
$form->handleRequest();
$form->render();
?>