/**
* @fileoverview Rotation Posts Performance Dashboard & Variant Trace Modal
* @module ui/rotation-performance-ui
* @description واجهة قياس كفاءة المنشورات، نسب النجاح في الجروبات، ونافذة تتبع سجل الإرسال التفصيلي.
*/
(global => {
'use strict';
const state = global.FritreeRotationState;
let currentMetricsPage = 1;
const METRICS_ITEMS_PER_PAGE = 8;
/**
* بناء الهيكل البصري لقسم تقييم أداء المنشورات
*/
const buildPerformanceLayout = () => {
const page = document.getElementById('xpoqh5yufi');
if (!page) return;
if (page.querySelector('#fj8dnuc75c')) return;
page.innerHTML = `
قياس أداء وكفاءة منشورات التدوير
اضغط على أي منشور لعرض سجل إرساله التفصيلي
| عنوان المنشور |
مرات التشغيل |
ناجح |
معلق |
فشل |
`;
};
/**
* بناء نافذة تتبع سجل الإرسال للمنشور (Variant Trace Modal)
*/
const appendTraceModalLayout = () => {
let modal = document.getElementById('sg405ywfqm');
if (modal) return;
modal = document.createElement('div');
modal.className = 'cpzxome5dd';
modal.id = 'sg405ywfqm';
modal.style.cssText = 'position: fixed; top: 0; left: 0; width: 100%; height: 100%; backdrop-filter: blur(8px); display: none; align-items: center; justify-content: center; z-index: var(--z-modal-backdrop); background-color: rgba(15, 23, 42, 0.65); direction: rtl; text-align: right; box-sizing: border-box;';
modal.innerHTML = `
سجل تتبع الإرسال والنشر للمنشور
| اسم الحملة |
الوجهة المستهدفة |
الحالة |
الرابط / الخطأ |
`;
document.body.appendChild(modal);
document.getElementById('c8r5l8id1i').onclick = () => {
modal.style.display = 'none';
};
};
/**
* رسم وتحديث لوحة تقييم كفاءة المنشورات
*/
const renderEvaluationDashboard = async () => {
const container = document.getElementById('i4jg5y3ylx');
const paginationContainer = document.getElementById('du4l2rjkr6');
if (!container) return;
container.innerHTML = '';
const campaignHistoryData = await global.FritreeStorage.get('campaignHistoryData', []);
const templateStatsMap = {};
campaignHistoryData.forEach(camp => {
if (camp.logs && Array.isArray(camp.logs)) {
camp.logs.forEach(log => {
const templateId = log.variantName;
if (templateId) {
if (!templateStatsMap[templateId]) {
templateStatsMap[templateId] = { usage: 0, success: 0, pending: 0, failed: 0 };
}
templateStatsMap[templateId].usage++;
if (log.status === 'success') templateStatsMap[templateId].success++;
else if (log.status === 'pending') templateStatsMap[templateId].pending++;
else templateStatsMap[templateId].failed++;
}
});
}
});
state.previousPostsData.forEach(p => {
const stats = templateStatsMap[p.id] || { usage: 0, success: 0, pending: 0, failed: 0 };
p.stats = stats;
p.usageCount = stats.usage;
});
if (global.FritreeRotationStore && typeof global.FritreeRotationStore.recalculateScores === 'function') {
global.FritreeRotationStore.recalculateScores();
}
const sorted = [...state.previousPostsData].sort((a, b) => (b.score || 0) - (a.score || 0));
if (state.previousPostsData.length === 0) {
container.innerHTML = '| لا توجد منشورات مسجلة في مكتبة التدوير حالياً. |
';
if (paginationContainer) paginationContainer.innerHTML = '';
updateEvaluationTotalsRow(sorted);
return;
}
const startIndex = (currentMetricsPage - 1) * METRICS_ITEMS_PER_PAGE;
const pageItems = sorted.slice(startIndex, startIndex + METRICS_ITEMS_PER_PAGE);
pageItems.forEach(p => {
const tr = document.createElement('tr');
tr.style.cssText = 'cursor: pointer; transition: background 0.15s; border-bottom: 1px solid var(--border);';
tr.onclick = () => openVariantTraceModal(p.id);
const tdTitle = document.createElement('td');
tdTitle.style.cssText = 'padding: 10px 12px; font-weight: 700;';
tdTitle.innerHTML = ` ${p.title || (p.text ? p.text.substring(0, 30) + '...' : 'منشور مؤرشف')}`;
const tdUsage = document.createElement('td');
tdUsage.style.cssText = 'padding: 10px; text-align: center; font-weight: 700; font-family: var(--font-code); color: var(--text-main);';
tdUsage.textContent = (p.stats ? p.stats.usage : p.usageCount || 0).toLocaleString('en-US');
const tdSuccess = document.createElement('td');
tdSuccess.style.cssText = 'padding: 10px; text-align: center; font-weight: 700; font-family: var(--font-code); color: var(--success);';
tdSuccess.textContent = (p.stats ? p.stats.success : 0).toLocaleString('en-US');
const tdPending = document.createElement('td');
tdPending.style.cssText = 'padding: 10px; text-align: center; font-weight: 700; font-family: var(--font-code); color: var(--warning);';
tdPending.textContent = (p.stats ? p.stats.pending : 0).toLocaleString('en-US');
const tdFailed = document.createElement('td');
tdFailed.style.cssText = 'padding: 10px; text-align: center; font-weight: 700; font-family: var(--font-code); color: var(--danger);';
tdFailed.textContent = (p.stats ? p.stats.failed : 0).toLocaleString('en-US');
tr.appendChild(tdTitle);
tr.appendChild(tdUsage);
tr.appendChild(tdSuccess);
tr.appendChild(tdPending);
tr.appendChild(tdFailed);
container.appendChild(tr);
});
updateEvaluationTotalsRow(sorted);
renderEvaluationPagination(sorted.length, paginationContainer);
};
/**
* تحديث عدادات إجمالي الأداء
*/
const updateEvaluationTotalsRow = (items) => {
let publishedSum = 0;
let successfulSum = 0;
let reviewedSum = 0;
let failedSum = 0;
items.forEach(p => {
if (p.stats) {
publishedSum += (p.stats.usage || 0);
successfulSum += (p.stats.success || 0);
reviewedSum += (p.stats.pending || 0);
failedSum += (p.stats.failed || 0);
}
});
const totalPubEl = document.getElementById('ylohpr45dl');
const totalSuccEl = document.getElementById('md8oymcc5c');
const totalRevEl = document.getElementById('qoumr7z4ii');
const totalFailEl = document.getElementById('s8t8cbmfne');
if (totalPubEl) totalPubEl.textContent = publishedSum.toLocaleString('en-US');
if (totalSuccEl) totalSuccEl.textContent = successfulSum.toLocaleString('en-US');
if (totalRevEl) totalRevEl.textContent = reviewedSum.toLocaleString('en-US');
if (totalFailEl) totalFailEl.textContent = failedSum.toLocaleString('en-US');
};
/**
* رسم أزرار ترقيم الصفحات
*/
const renderEvaluationPagination = (totalItems, container) => {
if (!container) return;
container.innerHTML = '';
const totalPages = Math.ceil(totalItems / METRICS_ITEMS_PER_PAGE);
if (totalPages <= 1) return;
const prevBtn = document.createElement('button');
prevBtn.className = 'ipxi2jz4g0';
prevBtn.style.cssText = 'padding: 4px 8px; font-size: 10.5px; min-height: 28px;';
prevBtn.innerHTML = ' ';
prevBtn.disabled = currentMetricsPage === 1;
prevBtn.onclick = () => {
if (currentMetricsPage > 1) {
currentMetricsPage--;
renderEvaluationDashboard();
}
};
const pageIndicator = document.createElement('span');
pageIndicator.style.cssText = 'font-weight: 700; font-size: 11px; color: var(--text-muted); font-family: var(--font-code); margin: 0 6px;';
pageIndicator.textContent = `صفحة ${currentMetricsPage.toLocaleString('en-US')} من ${totalPages.toLocaleString('en-US')}`;
const nextBtn = document.createElement('button');
nextBtn.className = 'ipxi2jz4g0';
nextBtn.style.cssText = 'padding: 4px 8px; font-size: 10.5px; min-height: 28px;';
nextBtn.innerHTML = ' ';
nextBtn.disabled = currentMetricsPage === totalPages;
nextBtn.onclick = () => {
if (currentMetricsPage < totalPages) {
currentMetricsPage++;
renderEvaluationDashboard();
}
};
container.appendChild(prevBtn);
container.appendChild(pageIndicator);
container.appendChild(nextBtn);
};
/**
* فتح نافذة تتبع سجل المنشور
* @param {string} postId
*/
const openVariantTraceModal = async (postId) => {
const tbody = document.getElementById('yx004dvp1r');
const metaInfo = document.getElementById('ka8vx2wbd1');
if (!tbody || !metaInfo) return;
tbody.innerHTML = '';
const post = state.previousPostsData.find(p => p.id === postId);
if (!post) return;
appendTraceModalLayout();
metaInfo.innerHTML = ` سجل تشغيل: "${post.title}" | الكفاءة: ${(post.score || 0).toLocaleString('en-US')}%`;
const campaignHistoryData = await global.FritreeStorage.get('campaignHistoryData', []);
let matchCount = 0;
campaignHistoryData.forEach(camp => {
if (camp.logs && Array.isArray(camp.logs)) {
camp.logs.forEach(log => {
if (log.variantName === postId) {
matchCount++;
const tr = document.createElement('tr');
const tdCamp = document.createElement('td');
tdCamp.style.padding = '8px 10px';
tdCamp.style.fontWeight = "700";
tdCamp.textContent = camp.name;
const tdTarget = document.createElement('td');
tdTarget.style.padding = '8px 10px';
tdTarget.textContent = log.groupId || "وجهة غير معروفة";
const tdStatus = document.createElement('td');
tdStatus.style.padding = '8px 10px';
tdStatus.style.textAlign = 'center';
const badge = document.createElement('span');
badge.className = `go30y9mfgh ${log.status === 'success' ? 'success' : (log.status === 'pending' ? 'pending' : 'failed')}`;
badge.textContent = log.status === 'success' ? 'تم النشر' : (log.status === 'pending' ? 'قيد المراجعة' : 'فشل');
tdStatus.appendChild(badge);
const tdLink = document.createElement('td');
tdLink.style.padding = '8px 10px';
tdLink.style.textAlign = 'center';
if (log.postUrl) {
const link = document.createElement('a');
link.href = log.postUrl;
link.target = '_blank';
link.style.cssText = 'font-weight: 700; color: var(--primary); text-decoration: none; display: inline-flex; align-items: center; gap: 4px;';
link.innerHTML = ' عرض المنشور';
tdLink.appendChild(link);
} else {
tdLink.innerHTML = `${log.error || 'غير متوفر'}`;
}
tr.appendChild(tdCamp);
tr.appendChild(tdTarget);
tr.appendChild(tdStatus);
tr.appendChild(tdLink);
tbody.appendChild(tr);
}
});
}
});
if (matchCount === 0) {
tbody.innerHTML = '| لا توجد سجلات إرسال لهذا المنشور حتى الآن. |
';
}
const modal = document.getElementById('sg405ywfqm');
if (modal) modal.style.display = 'flex';
};
/**
* تهيئة وحدة تقييم الأداء
*/
const initPerformanceModule = () => {
const page = document.getElementById('xpoqh5yufi');
if (!page) return false;
buildPerformanceLayout();
appendTraceModalLayout();
renderEvaluationDashboard();
return true;
};
/**
* تصدير وحدة واجهة تقييم أداء المنشورات
*/
global.FritreeRotationPerformance = {
init: initPerformanceModule,
renderDashboard: renderEvaluationDashboard,
openTraceModal: openVariantTraceModal
};
})(typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : this);