import type { MetadataRoute } from "next";
import { STATIC_ROUTES } from "@/lib/seo/routes";
import { apiGetAll, apiGet } from "@/lib/seo/api";
import { langUrl } from "@/lib/seo/metadata";
import { toIsoDate } from "@/lib/seo/text";
import { coursePath, encodePath } from "@/lib/course-url";

// يُعاد توليد الخريطة كل ساعة من الـ API الحيّ
export const revalidate = 3600;

type Entry = MetadataRoute.Sitemap[number];

const entry = (path: string, opts: Omit<Entry, "url" | "alternates">): Entry => ({
    url: langUrl(path, "ar"),
    alternates: { languages: { ar: langUrl(path, "ar"), en: langUrl(path, "en") } },
    ...opts,
});

/**
 * البرامج التدريبية: /training-courses/{id}-{slug} بـ slug مبني من عنوان كل لغة،
 * مع رابط النسخة الإنجليزية (hreflang) بالـ slug الإنجليزي. الـ API لا يعيد تاريخ تحديث
 * للبرامج، لذا lastModified = وقت توليد الخريطة (تُعاد كل ساعة).
 */
async function courseEntries(now: Date): Promise<Entry[]> {
    // ~28 صفحة × 100 برنامج حالياً؛ الحد 100 صفحة يترك مجالاً للنمو
    const [ar, en] = await Promise.all([apiGetAll("ar", "/courses", 100), apiGetAll("en", "/courses", 100)]);
    const enTitle = new Map(en.map((c: any) => [String(c?.id), c?.title as string | undefined]));
    return ar
        .filter((c: any) => c?.id !== undefined && c?.id !== null)
        .map((c: any) => {
            const arPath = encodePath(coursePath(c.id, c.title));
            const enPath = encodePath(coursePath(c.id, enTitle.get(String(c.id)) || c.title));
            return {
                url: langUrl(arPath, "ar"),
                alternates: { languages: { ar: langUrl(arPath, "ar"), en: langUrl(enPath, "en") } },
                lastModified: now,
                changeFrequency: "daily" as const,
                priority: 0.9,
            };
        });
}

/** القوائم الديناميكية — نفس نقاط الـ API التي تعرضها صفحات القوائم الأصلية */
const DYNAMIC: Array<{ api: string; base: string; priority: number; changeFrequency: Entry["changeFrequency"] }> = [
    { api: "/blogs", base: "/blogs", priority: 0.7, changeFrequency: "monthly" },
    { api: "/latestNews", base: "/news", priority: 0.6, changeFrequency: "monthly" },
    { api: "/seminars", base: "/seminars", priority: 0.6, changeFrequency: "monthly" },
    { api: "/offers", base: "/offers", priority: 0.6, changeFrequency: "weekly" },
    { api: "/dependencies", base: "/accreditations", priority: 0.5, changeFrequency: "monthly" },
    { api: "/categories", base: "/training-plans", priority: 0.7, changeFrequency: "monthly" },
    { api: "/home-pages?title_section=ivory_Achievements", base: "/achievements", priority: 0.5, changeFrequency: "monthly" },
];

export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
    const now = new Date();

    const staticEntries = Object.entries(STATIC_ROUTES)
        .filter(([, r]) => r.sitemap && !r.noindex)
        .map(([path, r]) => entry(path, { lastModified: now, priority: r.sitemap!.priority, changeFrequency: r.sitemap!.changeFrequency }));

    const courses = await courseEntries(now);

    const lists = await Promise.all(
        DYNAMIC.map(async (d) => {
            const items = await apiGetAll("ar", d.api);
            return items
                .filter((it) => it?.id !== undefined && it?.id !== null)
                .map((it) =>
                    entry(`${d.base}/${it.id}`, {
                        lastModified: toIsoDate(it?.updated_at || it?.date || it?.created_at) ? new Date(toIsoDate(it?.updated_at || it?.date || it?.created_at)!) : now,
                        priority: d.priority,
                        changeFrequency: d.changeFrequency,
                    })
                );
        })
    );

    // البودكاست: الحلقات موزّعة على تصنيفات (category-podcasts/{id})
    const podcastCats = await apiGet<any>("ar", "/category-podcasts", 3600);
    const cats: any[] = podcastCats?.data?.data ?? podcastCats?.data ?? [];
    const podcastLists = await Promise.all(
        (Array.isArray(cats) ? cats : []).slice(0, 30).map((c) => apiGetAll("ar", `/category-podcasts/${c?.id}`, 5))
    );
    const podcasts = podcastLists
        .flat()
        .filter((p) => p?.id !== undefined)
        .map((p) => entry(`/podcasts/${p.id}`, { lastModified: now, priority: 0.5, changeFrequency: "monthly" }));

    // إزالة التكرار
    const seen = new Set<string>();
    return [...staticEntries, ...courses, ...lists.flat(), ...podcasts].filter((e) => (seen.has(e.url) ? false : (seen.add(e.url), true)));
}
