import type { Metadata } from "next";
import View from "@/views/training-courses/training-courses";
import { UserPaymentProvider } from "@/store/user-payment";
import { resolveStatic } from "@/lib/seo/routes";
import { StaticSeo } from "@/lib/seo/static-route";
import { buildMetadata, langUrl } from "@/lib/seo/metadata";
import { getLang } from "@/lib/seo/lang";
import { apiBase, apiGet } from "@/lib/seo/api";
import { SeedQueries, type SeedEntry } from "@/lib/seo/seed";
import { JsonLd } from "@/lib/seo/jsonld";
import { absoluteUrl } from "@/lib/seo/site";
import { coursePath, encodePath } from "@/lib/course-url";
import type { Lang } from "@/config/constants";

type SP = Promise<Record<string, string | string[] | undefined>>;

const PATH = "/training-courses";
// نفس ترتيب المعاملات في filteringAndPagination داخل المكوّن الأصلي
const FILTERS = [
    ["title", "title"],
    ["dependence_id", "dependence_id"],
    ["city_id", "city_id"],
    ["subject", "subject"],
    ["category_id", "category_id"],
    ["start_date_week", "start_date_week"],
    ["end_date_week", "end_date_week"],
] as const;

const one = (v: string | string[] | undefined) => (Array.isArray(v) ? v[0] : v) ?? undefined;

function parse(sp: Record<string, string | string[] | undefined>) {
    const pageRaw = one(sp.page);
    const page = Math.max(1, Number.parseInt(pageRaw || "1", 10) || 1);
    const filters = FILTERS.map(([k]) => [k, one(sp[k])] as const).filter(([, v]) => !!v) as Array<readonly [string, string]>;
    return { pageRaw, page, filters, title: one(sp.title) ?? null, hasAnyParam: Object.keys(sp).length > 0 };
}

/** صفحة القائمة كما يطلبها المكوّن عند أول تصيير */
const initialApiUrl = (pageRaw?: string) => `/courses?page=${pageRaw || 1}&per_page=9`;

/** الطلب الذي يرسله المكوّن بعد التركيب (useEffect → filteringAndPagination / resetFilter) */
function afterMountApiUrl(p: ReturnType<typeof parse>) {
    if (!p.hasAnyParam) return `/courses?page=${p.pageRaw || 1}`;
    let url = `/courses?per_page=9&page=${p.pageRaw || 1}`;
    for (const [k, v] of p.filters) url += `&${k}=${v}`;
    return url;
}

async function loadList(lang: Lang, sp: Record<string, string | string[] | undefined>) {
    const p = parse(sp);
    const a = initialApiUrl(p.pageRaw);
    const b = afterMountApiUrl(p);
    const [ja, jb] = await Promise.all([apiGet<any>(lang, a), a === b ? null : apiGet<any>(lang, b)]);
    return { p, a, b, dataA: ja?.data, dataB: a === b ? ja?.data : jb?.data };
}

const pageLabel = (lang: Lang, n: number) => (lang === "ar" ? `صفحة ${n}` : `Page ${n}`);

export async function generateMetadata({ searchParams }: { searchParams: SP }): Promise<Metadata> {
    const sp = await searchParams;
    const lang = await getLang();
    const { p, dataA } = await loadList(lang, sp);
    const { title, description, keywords } = resolveStatic(PATH, lang);

    const courses: any[] = Array.isArray(dataA?.data) ? dataA.data : [];
    // كلمات مفتاحية من بيانات البرامج الحقيقية: تصنيفات ومجالات البرامج المعروضة
    const realKeywords = [
        ...new Set(
            courses
                .flatMap((c) => [c?.subject?.category?.title, c?.category?.title, c?.subject?.title])
                .filter((v) => typeof v === "string" && v.trim() && v !== "-")
        ),
    ].slice(0, 12) as string[];

    const total = Number(dataA?.meta?.total) || 0;
    const sample = courses.slice(0, 3).map((c) => c?.title).filter(Boolean).join("، ");
    const dataDescription =
        lang === "ar"
            ? `${total ? `${total} برنامجاً تدريبياً معتمداً` : "برامج تدريبية معتمدة"} من ايفوري للتدريب والاستشارات${sample ? ` مثل: ${sample}` : ""}. اختر المدينة والموعد وسجّل الآن.`
            : `${total ? `${total} accredited training programs` : "Accredited training programs"} by IVORY Training & Consulting${sample ? `, including ${sample}` : ""}. Pick a city and date and register today.`;

    const paged = p.page > 1 && p.filters.length === 0;
    return buildMetadata({
        lang,
        // الصفحات المرقّمة تشير إلى نفسها (لا إلى الصفحة الأولى) حتى تُفهرس البرامج في كل صفحة
        path: paged ? `${PATH}?page=${p.page}` : PATH,
        title: paged ? `${title.split(" | ")[0]} - ${pageLabel(lang, p.page)} | ${title.split(" | ").slice(1).join(" | ")}` : title,
        // وصف مبني على البيانات الحقيقية (العدد وأمثلة من البرامج)، والوصف الثابت عند تعذّر الـ API
        description: courses.length ? dataDescription : description,
        keywords: [...(keywords || []), ...realKeywords],
        // نتائج التصفية نسخ مكررة من القائمة: تُتبع روابطها ولا تُفهرس
        noindex: p.filters.length > 0,
    });
}

export default async function Page({ searchParams }: { searchParams: SP }) {
    const sp = await searchParams;
    const lang = await getLang();
    const { p, a, b, dataA, dataB } = await loadList(lang, sp);
    const base = apiBase(lang);

    // نفس مفاتيح React Query في المكوّن: ['courses', apiUrl, urlTitle, URL]
    const seeds: SeedEntry[] = [
        { queryKey: ["courses", a, p.title, base], data: dataA },
        ...(b !== a ? [{ queryKey: ["courses", b, p.title, base], data: dataB }] : []),
    ];

    const courses: any[] = Array.isArray(dataA?.data) ? dataA.data : [];
    const itemList = courses.length
        ? {
              "@context": "https://schema.org",
              "@type": "ItemList",
              name: resolveStatic(PATH, lang).title.split(" | ")[0],
              numberOfItems: courses.length,
              itemListElement: courses.map((c, i) => ({
                  "@type": "ListItem",
                  position: (p.page - 1) * 9 + i + 1,
                  url: langUrl(encodePath(coursePath(c?.id, c?.title)), lang),
                  name: c?.title,
                  ...(c?.subject?.category?.image || c?.category?.image
                      ? { image: absoluteUrl(c?.subject?.category?.image || c?.category?.image) }
                      : {}),
              })),
          }
        : null;

    return (
        <StaticSeo path={PATH}>
            {itemList && <JsonLd data={itemList} />}
            <SeedQueries entries={seeds}>
                <UserPaymentProvider>
                    <View />
                </UserPaymentProvider>
            </SeedQueries>
        </StaticSeo>
    );
}
