/**
 * تنظيف HTML القادم من محرر المحتوى (لوحة التحكم) قبل عرضه.
 * يعمل على الخادم والمتصفح (نص فقط، بلا DOM) فيبقى HTML الخادم مطابقاً لما يراه المستخدم.
 */

const escapeAttr = (v: string) => v.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;");

/**
 * لمحتوى المقالات والتفاصيل:
 *  - الصور بلا alt تأخذ عنوان المحتوى (alt) — محرر المحتوى لا يضيفه
 *  - أي <h1> داخل المحتوى يصبح <h2> حتى يبقى للصفحة عنوان رئيسي واحد
 */
export function cmsHtml(html?: string | null, { alt = "" }: { alt?: string } = {}): string {
    if (!html || typeof html !== "string") return "";
    return html
        .replace(/<img\b(?![^>]*\balt\s*=)([^>]*?)(\/?)>/gi, (_m, attrs: string, slash: string) => `<img${attrs} alt="${escapeAttr(alt)}"${slash}>`)
        .replace(/<(\/?)h1\b/gi, "<$1h2");
}

/** لبطاقات القوائم: نص مختصر بلا وسوم (بدل عرض المقال كاملاً داخل سطرين مقصوصين) */
export function cmsExcerpt(html?: string | null, max = 220): string {
    if (!html || typeof html !== "string") return "";
    const text = html
        .replace(/<style[\s\S]*?<\/style>|<script[\s\S]*?<\/script>/gi, " ")
        .replace(/<[^>]+>/g, " ")
        .replace(/&nbsp;/g, " ")
        .replace(/&amp;/g, "&")
        .replace(/&quot;/g, '"')
        .replace(/&#0?39;|&apos;/g, "'")
        .replace(/&lt;/g, "<")
        .replace(/&gt;/g, ">")
        .replace(/\s+/g, " ")
        .trim();
    if (text.length <= max) return text;
    const cut = text.slice(0, max);
    const space = cut.lastIndexOf(" ");
    return `${(space > max * 0.6 ? cut.slice(0, space) : cut).trim()}…`;
}
