/**
* @fileoverview Encrypted Migration & Workspace Backup Service (AES-256-GCM / PBKDF2 / ZIP)
* @module services/backup-service
* @description خدمة تصدير واستيراد النسخ الاحتياطية الشاملة والمستقلة لبيئة العمل وتشفير الوسائط وحزم البيانات.
*/
(global => {
'use strict';
/**
* تعريفات وحدات وأقسام بيئة العمل القابلة للتصدير والاستيراد
*/
const MODULE_DEFINITIONS = Object.freeze([
Object.freeze({
key: 'rotation_library',
title: 'مكتبة المنشورات وتدوير المحتوى',
icon: 'fa-arrows-spin',
color: '#0d9488',
desc: 'تصدير واستيراد كل منشوراتك المؤرشفة، الكلمات المفتاحية، الصور المرفقة، وحالة التدوير.'
}),
Object.freeze({
key: 'rotation_groups',
title: 'حزم ومجموعات المنشورات المخصصة',
icon: 'fa-layer-group',
color: '#8b5cf6',
desc: 'تصدير واستيراد الحزم والمجموعات المخصصة بالمنشورات المحددة للتدوير.'
}),
Object.freeze({
key: 'rotation_followups',
title: 'رسائل المتابعة التلقائية للواتساب',
icon: 'fa-brands fa-whatsapp',
color: '#00a884',
desc: 'تصدير واستيراد رسائل ومواعيد وتكرار المتابعة المرتبطة بالعملاء والمنشورات.'
}),
Object.freeze({
key: 'campaign_history',
title: 'أرشيف سجلات الحملات والنتائج',
icon: 'fa-box-archive',
color: '#3b82f6',
desc: 'تصدير واستيراد السجل الكامل لنتائج النشر والبث وتفاصيل الوجهات.'
}),
Object.freeze({
key: 'scheduled_campaigns',
title: 'طابور الحملات المجدولة المستقبلية',
icon: 'fa-calendar-days',
color: '#f59e0b',
desc: 'تصدير واستيراد طابور الحملات المجدولة ومواعيدها ومرفقاتها.'
}),
Object.freeze({
key: 'facebook_registry',
title: 'مجموعات فيسبوك، رادار السلامة، والتصنيفات',
icon: 'fa-users-rectangle',
color: '#1877f2',
desc: 'تصدير واستيراد قائمة جروبات الفيسبوك، الشرائح، الحجر الصحي، والتصنيفات.'
}),
Object.freeze({
key: 'whatsapp_queue',
title: 'طابور مستلمي وأرقام واتساب',
icon: 'fa-address-book',
color: '#10b981',
desc: 'تصدير واستيراد قائمة أرقام ومستلمي الواتساب في طابور الانتظار.'
}),
Object.freeze({
key: 'protection_pacing',
title: 'إعدادات التخفي وفترات تبريد الاتصال',
icon: 'fa-shield-halved',
color: '#6366f1',
desc: 'تصدير واستيراد إعدادات دروع التخفي ومحاكاة السلوك وفترات الانتظار.'
}),
Object.freeze({
key: 'contacts_manager',
title: 'سجل جهات الاتصال والعملاء والوسوم',
icon: 'fa-address-book',
color: '#0284c7',
desc: 'تصدير واستيراد كل بيانات العميل، مراحل المبيعات، الوسوم، والحقول المخصصة.'
}),
Object.freeze({
key: 'calendar_agenda',
title: 'تقويم المهام والأجندة الذكية والتذكيرات',
icon: 'fa-calendar-check',
color: '#1d4ed8',
desc: 'تصدير واستيراد كل أحداث ومهام الأجندة والمواعيد المجدولة.'
}),
Object.freeze({
key: 'fb_recent_published',
title: 'سجل التعبئة السريعة لمنشورات فيسبوك',
icon: 'fa-clock-rotate-left',
color: '#059669',
desc: 'تصدير واستيراد سجل التعبئة السريعة والمنشورات الحديثة.'
}),
Object.freeze({
key: 'store_rates_cache',
title: 'إعدادات المتجر وأسعار الصرف المؤرشفة',
icon: 'fa-store',
color: '#7c3aed',
desc: 'تصدير واستيراد أسعار الصرف المؤرشفة محلياً وبيانات المتجر.'
})
]);
/**
* تحويل Blob إلى نص Base64
*/
async function blobToBase64(blob) {
if (global.FritreeStorage && typeof global.FritreeStorage.blobToB64 === 'function') {
return await global.FritreeStorage.blobToB64(blob);
}
if (blob instanceof Uint8Array) {
blob = new Blob([blob]);
}
const buffer = await blob.arrayBuffer();
const bytes = new Uint8Array(buffer);
let binary = '';
for (let i = 0; i < bytes.byteLength; i++) {
binary += String.fromCharCode(bytes[i]);
}
return `data:${blob.type || 'image/jpeg'};base64,${btoa(binary)}`;
}
/**
* تحويل نص Base64 إلى Blob
*/
function base64ToBlob(base64Data) {
if (global.FritreeStorage && typeof global.FritreeStorage.b64ToBlob === 'function') {
return global.FritreeStorage.b64ToBlob(base64Data);
}
const parts = base64Data.split(",");
const mimeType = parts[0].split(":")[1].split(";")[0];
const byteCharacters = atob(parts[1] || parts[0]);
const byteArrays = [];
for (let offset = 0; offset < byteCharacters.length; offset += 512) {
const slice = byteCharacters.slice(offset, offset + 512);
const byteNumbers = new Array(slice.length);
for (let i = 0; i < slice.length; i++) {
byteNumbers[i] = slice.charCodeAt(i);
}
const byteArray = new Uint8Array(byteNumbers);
byteArrays.push(byteArray);
}
return new Blob(byteArrays, { type: mimeType });
}
/**
* بناء واجهة قسم النسخ الاحتياطي والتصدير والاستيراد (#oboufoudrv)
*/
function buildBackupPaneLayout() {
const contentArea = document.getElementById('s7ihkirolg');
if (!contentArea) return false;
const host = document.getElementById('fritree-dynamic-panes-host') || contentArea;
let pane = document.getElementById('oboufoudrv');
if (pane) {
if (pane.parentElement !== host) {
host.appendChild(pane);
}
return true;
}
pane = document.createElement('section');
pane.className = 'rjiai07g77';
pane.id = 'oboufoudrv';
pane.innerHTML = `
مركز النسخ الاحتياطي وتصدير واستيراد بيئة العمل
تشفير متقدم AES-256-GCM مع دعم تقييد النسخ بكود الجهاز الموثق أو تصديرها كنسخ عامة.
تصدير واستيراد الأقسام والوحدات المستقلة
`;
host.appendChild(pane);
renderModulesGrid();
bindBackupEvents();
return true;
}
/**
* رسم شبكة بطاقات الأقسام المستقلة
*/
function renderModulesGrid() {
const container = document.getElementById('backup-modules-grid');
if (!container) return;
container.innerHTML = '';
MODULE_DEFINITIONS.forEach(mod => {
const card = document.createElement('div');
card.style.cssText = `
border: 1px solid var(--border);
border-radius: var(--radius-lg);
padding: 14px;
background: var(--bg-card);
display: flex;
flex-direction: column;
justify-content: space-between;
gap: 8px;
box-shadow: var(--shadow-xs);
box-sizing: border-box;
`;
card.innerHTML = `
${mod.title}
${mod.desc}
جاري الحساب...
`;
container.appendChild(card);
});
refreshModuleBadges();
}
/**
* تجميع بيانات قسم محدد من التخزين المشفر
* @param {string} moduleKey
* @returns {Promise<{ payload: Object, mediaBlobsToExport: Array