/**
 * روابط البرامج التدريبية الصديقة لمحركات البحث: /training-courses/{id}-{slug}
 *
 * - المعرّف الرقمي هو المرجع الوحيد لجلب البيانات (الـ slug تجميلي فقط).
 * - الـ slug يُولَّد من عنوان البرنامج بلغة الصفحة (لا من حقل slug في الـ API:
 *   قيمته غير متّسقة — عربية في القائمة وإنجليزية في التفاصيل لنفس البرنامج).
 * - أي slug يُقبل عند الطلب (يُستخرج الرقم فقط)، والرابط القانوني (canonical) يوحّد النسخ.
 *
 * يعمل على الخادم والمتصفح والـ middleware (بلا اعتماديات).
 */

export const COURSE_BASE = "/training-courses";
const MAX_SLUG_LENGTH = 80;

/** عنوان → slug: أحرف عربية/لاتينية وأرقام، وما عداها شرطة واحدة. */
export function slugify(input?: string | null): string {
    if (!input) return "";
    const s = String(input)
        .normalize("NFKC")
        .toLowerCase()
        // التشكيل والتطويل العربي
        .replace(/[ً-ٰٟـ]/g, "")
        // كل ما ليس حرفاً أو رقماً (بأي لغة) يصبح شرطة
        .replace(/[^\p{L}\p{N}]+/gu, "-")
        .replace(/^-+|-+$/g, "");
    if (s.length <= MAX_SLUG_LENGTH) return s;
    // القصّ عند حدود كلمة
    const cut = s.slice(0, MAX_SLUG_LENGTH);
    const lastDash = cut.lastIndexOf("-");
    return (lastDash > MAX_SLUG_LENGTH * 0.5 ? cut.slice(0, lastDash) : cut).replace(/-+$/g, "");
}

/** جزء المسار: "123-عنوان-البرنامج" (أو "123" إن لم يوجد عنوان) */
export function courseSegment(id: string | number, title?: string | null): string {
    const slug = slugify(title);
    return slug ? `${id}-${slug}` : String(id);
}

/** المسار غير المرمَّز (للعرض و<Link>) */
export function coursePath(id: string | number, title?: string | null): string {
    return `${COURSE_BASE}/${courseSegment(id, title)}`;
}

/** رابط البرنامج من كائن الـ API، مع معاملات اختيارية (city_id، ref...) */
export function courseHref(
    course: { id?: string | number | null; title?: string | null } | null | undefined,
    query?: Record<string, string | number | null | undefined>
): string {
    if (!course?.id && course?.id !== 0) return COURSE_BASE;
    const base = coursePath(course.id as string | number, course.title);
    const qs = query
        ? Object.entries(query)
              .filter(([, v]) => v !== undefined && v !== null && v !== "")
              .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`)
              .join("&")
        : "";
    return qs ? `${base}?${qs}` : base;
}

/** المسار مرمَّزاً (ASCII) — لـ Location في التحويلات، وsitemap، وcanonical */
export function encodePath(path: string): string {
    return path
        .split("/")
        .map((seg) => (seg ? encodeURIComponent(decodeSafe(seg)) : seg))
        .join("/");
}

function decodeSafe(s: string) {
    try {
        return decodeURIComponent(s);
    } catch {
        return s;
    }
}

/**
 * "123-any-slug" | "123" | "%D8..." → "123"، وغير ذلك → null.
 * يقبل أي slug بعد الرقم (روابط قديمة، تغيّر العنوان، لغة أخرى).
 */
export function parseCourseParam(param?: string | string[] | null): string | null {
    const raw = Array.isArray(param) ? param[0] : param;
    if (!raw) return null;
    const m = decodeSafe(String(raw)).match(/^(\d+)(?:-|$)/);
    return m ? m[1] : null;
}

/** هل الجزء رقم فقط؟ (رابط قديم يحتاج تحويلاً 301 إلى الرابط مع الـ slug) */
export function isLegacyCourseParam(param?: string | null): boolean {
    return !!param && /^\d+$/.test(param);
}
