import { NextResponse, type NextRequest } from "next/server";
import { COURSE_BASE, coursePath, encodePath } from "@/lib/course-url";

const LANG_COOKIE = "i18nextLng";
const LANG_HEADER = "x-ivory-lang";
const API_URL = (process.env.NEXT_PUBLIC_IVORY_API || "https://e-training.ivorytraining.com/api").replace(/\/+$/, "");

// /training-courses/123 (أو /123/) فقط — لا يشمل مسارات الدفع /123/payment/...
const LEGACY_COURSE = new RegExp(`^${COURSE_BASE}/(\\d+)/?$`);

/** عناوين البرامج لكل لغة — ذاكرة مؤقتة داخل العملية لتجنّب طلب الـ API لكل تحويل */
const titleCache = new Map<string, { title: string | null; at: number }>();
const TITLE_TTL = 60 * 60 * 1000;

async function courseTitle(id: string, lang: string): Promise<string | null | undefined> {
    const key = `${lang}:${id}`;
    const hit = titleCache.get(key);
    if (hit && Date.now() - hit.at < TITLE_TTL) return hit.title;
    try {
        const res = await fetch(`${API_URL}/${lang}/courses/${id}`, {
            headers: { Accept: "application/json" },
            signal: AbortSignal.timeout(4000),
        });
        // غير موجود: نترك الطلب يمرّ لتعرض الصفحة 404 الخاصة بها
        if (res.status === 404) {
            titleCache.set(key, { title: null, at: Date.now() });
            return null;
        }
        if (!res.ok) return undefined;
        const title = (await res.json())?.data?.title ?? null;
        if (titleCache.size > 5000) titleCache.clear();
        titleCache.set(key, { title, at: Date.now() });
        return title;
    } catch {
        return undefined; // فشل مؤقت: لا تحويل، والصفحة تعمل بالرقم وحده
    }
}

/**
 * 1) تحويل دائم (301) للروابط القديمة /training-courses/{id} إلى /training-courses/{id}-{slug}
 * 2) تحديد لغة الطلب قبل التصيير:
 *    - ?lang=en | ?lang=ar  → تُعتمد للطلب الحالي وتُحفظ في Cookie
 *      (هذا ما يجعل النسخة الإنجليزية قابلة للزحف عبر روابط hreflang)
 *    - وإلا: Cookie المحفوظة، وإلا العربية
 */
export async function middleware(req: NextRequest) {
    const q = req.nextUrl.searchParams.get("lang");
    const fromQuery = q === "ar" || q === "en" ? q : null;
    const cookie = req.cookies.get(LANG_COOKIE)?.value;
    const lang = fromQuery || (cookie === "en" || cookie === "ar" ? cookie : "ar");

    // طلبات بيانات الموجّه (RSC/prefetch) تتبع التحويل أيضاً، فيتحدّث الرابط في المتصفح
    const legacy = req.nextUrl.pathname.match(LEGACY_COURSE);
    if (legacy && req.method === "GET") {
        const id = legacy[1];
        const title = await courseTitle(id, lang);
        if (title) {
            const target = req.nextUrl.clone();
            target.pathname = encodePath(coursePath(id, title));
            const res = NextResponse.redirect(target, 301);
            if (fromQuery && fromQuery !== cookie) {
                res.cookies.set(LANG_COOKIE, fromQuery, { path: "/", maxAge: 60 * 60 * 24 * 365, sameSite: "lax" });
            }
            return res;
        }
    }

    const headers = new Headers(req.headers);
    headers.set(LANG_HEADER, lang);

    const res = NextResponse.next({ request: { headers } });
    if (fromQuery && fromQuery !== cookie) {
        res.cookies.set(LANG_COOKIE, fromQuery, { path: "/", maxAge: 60 * 60 * 24 * 365, sameSite: "lax" });
    }
    // المحتوى يختلف باللغة — يمنع أي CDN من خلط النسختين
    res.headers.set("Vary", "Cookie");
    return res;
}

export const config = {
    // كل المسارات ما عدا الملفات الثابتة وملفات SEO
    matcher: ["/((?!_next/static|_next/image|favicon.ico|IvoryLogo.svg|og-image.png|robots.txt|sitemap.xml).*)"],
};
