<?php
if (!function_exists('ua_log_text')) {
  function ua_log_text($value, string $fallback = ''): string {
    $text = trim((string)$value);
    return $text !== '' ? $text : $fallback;
  }
}

if (!function_exists('ua_log_compact')) {
  function ua_log_compact(string $text): string {
    $text = trim(preg_replace('/\s+/u', ' ', $text));
    return $text;
  }
}

if (!function_exists('ua_device_native_log_digest')) {
  function ua_device_native_log_digest(string $rawEvent): string {
    $raw = strtolower($rawEvent);
    $items = [];
    $checks = [
      'password auth succeeded' => 'تسجيل دخول ناجح إلى الجهاز',
      'exit before auth' => 'محاولة دخول SSH لم تكتمل',
      'child connection' => 'محاولة اتصال SSH',
      'disconnect received' => 'انتهاء جلسة اتصال',
      'exited normally' => 'خروج طبيعي من جلسة الجهاز',
      'wireless:' => 'أحداث اتصال لاسلكي',
      'sending auth' => 'بدء مصادقة لاسلكية',
      'received assoc_resp' => 'قبول ارتباط لاسلكي',
      'new access point' => 'تغيير/تثبيت نقطة الاتصال اللاسلكية',
      'scan request completed' => 'اكتمل مسح الشبكات اللاسلكية',
      'dhcp' => 'نشاط DHCP',
      'dnsmasq' => 'تشغيل أو تحديث خدمة DNS/DHCP',
      'server started' => 'تشغيل خدمة داخل الجهاز',
      'server stopped' => 'إيقاف خدمة داخل الجهاز',
      'system: start' => 'بدء تشغيل النظام',
      'filesystem: start check' => 'بدء فحص نظام الملفات',
      'filesystem: end check' => 'انتهاء فحص نظام الملفات',
      'error' => 'وجود رسالة خطأ في اللوج',
      'failed' => 'وجود عملية فاشلة في اللوج',
      'timeout' => 'وجود مهلة اتصال أو انتظار',
    ];
    foreach ($checks as $needle => $label) {
      $count = substr_count($raw, $needle);
      if ($count > 0) $items[] = $label . ($count > 1 ? ' (' . $count . ')' : '');
    }
    if (!$items) return 'تم سحب اللوج الحقيقي من الجهاز، ولم تظهر أحداث مصنفة تلقائياً.';
    return 'أبرز ما ظهر في اللوج: ' . implode('، ', array_slice($items, 0, 8)) . '.';
  }
}

if (!function_exists('ua_device_native_log_parse_line')) {
  function ua_device_native_log_parse_line(string $line): array {
    $line = trim($line);
    $time = '';
    $service = '';
    $message = $line;
    if (preg_match('/^([A-Z][a-z]{2}\s+\d{1,2}\s+\d{2}:\d{2}:\d{2})\s+([^:]+):\s*(.*)$/u', $line, $m)) {
      $time = $m[1];
      $service = trim($m[2]);
      $message = trim($m[3]);
    } elseif (preg_match('/^(\d{4}-\d{2}-\d{2}[ T]\d{2}:\d{2}:\d{2})\s+([^:]+):\s*(.*)$/u', $line, $m)) {
      $time = $m[1];
      $service = trim($m[2]);
      $message = trim($m[3]);
    } elseif (preg_match('/^(\[[^\]]+\])\s*(.*)$/u', $line, $m)) {
      $time = $m[1];
      $message = trim($m[2]);
    }
    return ['time'=>$time, 'service'=>$service, 'message'=>$message, 'line'=>$line];
  }
}

if (!function_exists('ua_device_native_log_translate_line')) {
  function ua_device_native_log_translate_line(string $line): string {
    $parts = ua_device_native_log_parse_line($line);
    $msg = $parts['message'];
    $service = $parts['service'];
    $hay = strtolower($service . ' ' . $msg);
    $prefix = $parts['time'] !== '' ? $parts['time'] . ' - ' : '';

    $patterns = [
      '/syslogd started/i' => 'بدء خدمة تسجيل أحداث النظام.',
      '/syslogd exiting/i' => 'إيقاف خدمة تسجيل أحداث النظام.',
      '/busybox/i' => 'تشغيل مكوّن BusyBox الخاص بخدمات النظام.',
      '/\bsystem\s*:?\s*start\b/i' => 'بدء تشغيل نظام الجهاز.',
      '/filesystem\s*:?\s*start check/i' => 'بدء فحص نظام الملفات الداخلي.',
      '/filesystem\s*:?\s*end check/i' => 'انتهاء فحص نظام الملفات الداخلي.',
      '/historical data header invalid/i' => 'ملف الإحصاءات التاريخية غير صالح أو تمت إعادة تهيئته.',
      '/management radio timeout/i' => 'انتهت مهلة راديو الإدارة وتم تعطيله.',
      '/provmode:\s*starting management radio/i' => 'تشغيل راديو الإدارة المؤقت.',
      '/dnsmasq.*started/i' => 'بدء خدمة DNS/DHCP داخل الجهاز.',
      '/dnsmasq.*exiting/i' => 'إيقاف خدمة DNS/DHCP.',
      '/dnsmasq.*read \/etc\/hosts/i' => 'قراءة ملف العناوين المحلي داخل الجهاز.',
      '/dnsmasq.*listening/i' => 'خدمة DNS بدأت الاستماع على واجهة شبكة.',
      '/dnsmasq.*ignoring nameserver/i' => 'تم تجاهل DNS لأنه يشير إلى واجهة محلية.',
      '/dhcp.*ip range/i' => 'تحديد نطاق عناوين DHCP.',
      '/dhcp.*lease/i' => 'تسجيل أو تحديث مدة تأجير DHCP.',
      '/dhcp.*bound/i' => 'ربط DHCP بواجهة محددة.',
      '/\binit\s*:?\s*run:/i' => 'تشغيل خدمة أو أمر داخلي.',
      '/\binit\s*:?\s*starting pid/i' => 'بدء عملية داخلية جديدة.',
      '/init:.*exited.*scheduling for restart/i' => 'خدمة توقفت وسيتم إعادة تشغيلها تلقائياً.',
      '/dropbear.*not backgrounding/i' => 'خدمة SSH تعمل في الواجهة الأمامية.',
      '/dropbear.*child connection from/i' => 'محاولة اتصال SSH واردة إلى الجهاز.',
      '/dropbear.*password auth succeeded/i' => 'تسجيل دخول SSH ناجح بكلمة مرور.',
      '/dropbear.*exit before auth/i' => 'محاولة SSH انقطعت قبل إكمال المصادقة.',
      '/dropbear.*disconnect received/i' => 'تم قطع اتصال جلسة SSH من الطرف المقابل.',
      '/dropbear.*exited normally/i' => 'انتهت جلسة SSH بشكل طبيعي.',
      '/dropbear.*bad password/i' => 'محاولة دخول SSH بكلمة مرور خاطئة.',
      '/dropbear.*login attempt/i' => 'محاولة تسجيل دخول عبر SSH.',
      '/httpd.*password auth succeeded/i' => 'تسجيل دخول ناجح إلى واجهة الويب.',
      '/httpd.*auth failed/i' => 'فشل تسجيل الدخول إلى واجهة الويب.',
      '/lighttpd.*server started/i' => 'تشغيل خادم الويب الداخلي.',
      '/lighttpd.*server stopped/i' => 'إيقاف خادم الويب الداخلي.',
      '/wireless:.*scan request completed/i' => 'اكتمل مسح الشبكات اللاسلكية.',
      '/wireless:.*set mode/i' => 'تغيير وضع الواجهة اللاسلكية.',
      '/wireless:.*set frequency/i' => 'تغيير تردد/قناة الاتصال اللاسلكي.',
      '/wireless:.*sending auth/i' => 'إرسال طلب مصادقة لاسلكية.',
      '/wireless:.*received auth/i' => 'استلام رد مصادقة لاسلكية.',
      '/wireless:.*sending assoc_req/i' => 'إرسال طلب ارتباط لاسلكي.',
      '/wireless:.*received assoc_resp/i' => 'استلام رد ارتباط لاسلكي.',
      '/wireless:.*new access point/i' => 'تثبيت أو تغيير نقطة الاتصال اللاسلكية.',
      '/wireless:.*disassoc/i' => 'فصل ارتباط لاسلكي.',
      '/wireless:.*deauth/i' => 'إلغاء مصادقة لاسلكية.',
      '/wireless:.*radar/i' => 'حدث متعلق بكشف الرادار أو DFS.',
      '/wireless:.*noise/i' => 'تغير أو قراءة في مستوى الضجيج اللاسلكي.',
      '/wireless:.*signal/i' => 'تغير أو قراءة في مستوى الإشارة اللاسلكية.',
      '/link=up|link up/i' => 'رابط الشبكة أصبح متصلاً.',
      '/link=down|link down/i' => 'رابط الشبكة انقطع.',
      '/speed=([0-9]+)mbps/i' => 'تحديث سرعة منفذ الشبكة.',
      '/duplex=full/i' => 'المنفذ يعمل بنمط ازدواج كامل.',
      '/duplex=half/i' => 'المنفذ يعمل بنمط نصف ازدواج.',
      '/udapi-server/i' => 'تشغيل أو تحديث خدمة UDAPI الداخلية.',
      '/udapi-bridge/i' => 'تشغيل جسر UDAPI الداخلي.',
      '/ubntspecd/i' => 'تشغيل خدمة الطيف/القياسات الخاصة بـ Ubiquiti.',
      '/ulogger/i' => 'تشغيل خدمة تجميع السجلات.',
      '/ustatsd/i' => 'تشغيل أو تحديث خدمة الإحصاءات.',
      '/infctld/i' => 'تشغيل خدمة التحكم الداخلية.',
      '/wpa_supplicant/i' => 'تشغيل خدمة مصادقة الاتصال اللاسلكي.',
      '/getty/i' => 'تشغيل منفذ كونسول تسلسلي.',
      '/kernel/i' => 'رسالة من نواة النظام.',
      '/reboot|restart/i' => 'إعادة تشغيل أو طلب إعادة تشغيل.',
      '/ntp/i' => 'تحديث أو مزامنة الوقت.',
      '/config|cfgmtd|save/i' => 'تغيير أو حفظ إعدادات الجهاز.',
      '/firmware|upgrade/i' => 'حدث متعلق بالفيرموير أو الترقية.',
      '/error reading/i' => 'خطأ أثناء قراءة اتصال أو بيانات.',
      '/connection reset/i' => 'تمت إعادة تعيين الاتصال من الطرف الآخر.',
      '/timeout|timed out/i' => 'انتهت مهلة الانتظار أو الاتصال.',
      '/failed|failure/i' => 'عملية فاشلة مسجلة في اللوج.',
      '/error/i' => 'رسالة خطأ مسجلة في اللوج.',
      '/warning|warn/i' => 'تحذير مسجل في اللوج.',
    ];
    foreach ($patterns as $pattern => $text) {
      if (preg_match($pattern, $hay)) return $prefix . $text . ' [' . $parts['line'] . ']';
    }
    if (preg_match('/^===\s*date\s*===$/i', $line)) return 'قسم وقت السحب من الجهاز.';
    if (preg_match('/^===\s*log\s*===$/i', $line)) return 'بداية سجل أحداث الجهاز.';
    if (preg_match('/^===\s*dmesg\s*===$/i', $line)) return 'بداية رسائل نواة النظام.';
    if (preg_match('/^\d{4}-\d{2}-\d{2}[ T]\d{2}:\d{2}:\d{2}$/u', $line)) {
      return 'وقت الجهاز عند سحب اللوج: ' . $line;
    }
    if ($service !== '') {
      return $prefix . 'رسالة من خدمة ' . $service . ': ' . $msg . ' [' . $parts['line'] . ']';
    }
    if (preg_match('/^\d{4}-\d{2}-\d{2}|\b[A-Z][a-z]{2}\s+\d{1,2}\b/u', $line)) {
      return $prefix . 'رسالة نظام عامة: ' . $parts['line'];
    }
    return 'سطر لوج عام: ' . $line;
  }
}

if (!function_exists('ua_device_native_log_translate_lines')) {
  function ua_device_native_log_translate_lines(string $rawEvent, int $limit = 220): string {
    $lines = preg_split('/\R/u', trim($rawEvent)) ?: [];
    $out = [];
    $count = 0;
    foreach ($lines as $line) {
      $line = trim((string)$line);
      if ($line === '') continue;
      $out[] = ua_device_native_log_translate_line($line);
      $count++;
      if ($count >= $limit) {
        $remaining = count(array_filter($lines, static fn($v) => trim((string)$v) !== '')) - $count;
        if ($remaining > 0) $out[] = 'تم اختصار الترجمة: بقي ' . $remaining . ' سطر غير معروض.';
        break;
      }
    }
    return implode("\n", $out);
  }
}

if (!function_exists('ua_device_log_translate')) {
  function ua_device_log_translate(string $status, string $rawEvent = '', string $source = ''): string {
    $status = strtolower(trim($status));
    $raw = strtolower($rawEvent);
    $source = strtolower(trim($source));

    if (str_contains($raw, 'action=device_created')) {
      return 'تمت إضافة جهاز جديد إلى النظام.';
    }
    if (str_contains($raw, 'action=device_saved')) {
      return 'تم حفظ إعدادات الجهاز في النظام.';
    }
    if (str_contains($raw, 'action=device_deleted')) {
      return 'تم حذف الجهاز من النظام.';
    }
    if ($source === 'device_native_log') {
      return ($status === 'success' || $status === 'ok') ? ua_device_native_log_digest($rawEvent) : 'فشل سحب سجل الأحداث الحقيقي من داخل الجهاز.';
    }
    if (str_contains($raw, 'route=') || str_contains($raw, 'vendor=') || str_contains($raw, 'client_count_method=')) {
      if ($status === 'success' || $status === 'ok' || str_contains($raw, 'status=success')) {
        return 'تم فحص الجهاز وتحديث مسار الاتصال وبيانات القراءة بنجاح.';
      }
      if ($status === 'partial' || str_contains($raw, 'status=partial')) {
        return 'تم الوصول إلى الجهاز جزئياً وتحتاج بعض بيانات القراءة للمراجعة.';
      }
    }
    if ($status === 'success' || $status === 'ok' || str_contains($raw, 'status=success')) {
      if (str_contains($raw, 'bridge') || str_contains($raw, 'fdb') || str_contains($raw, 'mac')) {
        return 'تم فحص الجهاز بنجاح وجلب بيانات الربط أو MAC الخاصة به.';
      }
      return 'تم الاتصال بالجهاز وقراءة حالته بنجاح.';
    }
    if ($status === 'partial' || str_contains($raw, 'status=partial')) {
      return 'تم تسجيل نتيجة جزئية للجهاز وتحتاج إلى متابعة.';
    }
    if (str_contains($raw, 'login_failed') || str_contains($raw, 'unauthorized') || str_contains($raw, 'forbidden')) {
      return 'فشل الدخول إلى الجهاز. تحقق من اسم المستخدم أو كلمة المرور.';
    }
    if (str_contains($raw, 'timeout') || str_contains($raw, 'timed out')) {
      return 'انتهت مهلة الاتصال بالجهاز.';
    }
    if (str_contains($raw, 'snmp')) {
      return 'تعذر جلب بيانات الجهاز عبر SNMP.';
    }
    if (str_contains($raw, 'not_json') || str_contains($raw, 'invalid')) {
      return 'استجاب الجهاز ببيانات غير مفهومة أو غير مكتملة.';
    }
    if ($status === 'failed' || $status === 'error') {
      return 'فشل فحص الجهاز أو لم يتم الوصول إلى واجهة القراءة.';
    }
    return $source !== '' ? 'تم تسجيل حدث جهاز من المصدر ' . $source . '.' : 'تم تسجيل حدث جهاز.';
  }
}
