import "server-only";
import type { ReactNode } from "react";
import type { Lang } from "@/config/constants";
import { apiBase, apiGet } from "./api";
import { getLang } from "./lang";
import { SeedQueries, type SeedEntry } from "./seed";

/**
 * بيانات القوائم التي تجلبها المكوّنات الأصلية عبر React Query في المتصفح.
 * كل عنصر يكرّر حرفياً: الطلب + مفتاح React Query + تحويل الاستجابة في queryFn،
 * فيجد المكوّن البيانات جاهزة عند أول تصيير ويظهر المحتوى كاملاً في HTML الخادم.
 *
 * مستثنى عمداً: قوائم المدونات وأخبار الصفحة الرئيسية — استجاباتها تحمل النص الكامل
 * لكل مقال (≈1.2MB لـ 9 مدونات) وحقنها في HTML يضر بسرعة الصفحة أكثر مما يفيد.
 */
type ListSeed = {
    path: string;
    key: (base: string, lang: Lang) => unknown[];
    select: (json: any) => unknown;
};

// نفس useHomeSection: [`home-section-${name}`, name, URL, lang] ← data.data.data || []
const homeSection = (name: string): ListSeed => ({
    path: `/home-pages?title_section=${name}`,
    key: (base, lang) => [`home-section-${name}`, name, base, lang],
    select: (j) => j?.data?.data || [],
});

export const LIST_SEEDS = {
    // views/podcasts/podcasts.tsx
    podcasts: { path: "/category-podcasts", key: (b) => ["main-podcasts", b], select: (j) => j?.data?.data ?? j?.data },
    // views/offers/offers.tsx
    offers: { path: "/offers", key: (b) => ["offers", b], select: (j) => j?.data?.data ?? j?.data },
    // views/seminars/seminars.tsx
    seminars: { path: "/seminars", key: (b) => ["seminars", b], select: (j) => j?.data?.data ?? j?.data },
    // views/accreditations/accreditations.tsx (search = "")
    accreditations: { path: "/dependencies?title=", key: (b) => ["accreditations", b, ""], select: (j) => j?.data?.data },
    // views/news/news.tsx (currentPage = 1, search = "") — يخزّن الاستجابة كاملة
    news: { path: "/latestNews?page=1&title=&per_page=12", key: (b) => ["allNews", 1, b, ""], select: (j) => j },
    // views/achievements + views/home/components/ivory-achievements
    achievements: homeSection("ivory_Achievements"),
    // views/home/components/*
    homeTopSlider: homeSection("top_slider"),
    homeNumbers: homeSection("ivory_numbers"),
    homeSliders: { path: "/siders", key: (b) => ["sliders-home", b], select: (j) => j?.data?.data },
    homeAccreditations: { path: "/dependencies?per_page=100", key: (b) => ["dependencies-slider", b], select: (j) => j?.data?.data },
    homeClients: { path: "/clients?per_page=200", key: (b) => ["clients-slider", b], select: (j) => j?.data?.data },
} satisfies Record<string, ListSeed>;

export type ListSeedName = keyof typeof LIST_SEEDS;

export async function loadListSeeds(lang: Lang, names: ListSeedName[]): Promise<SeedEntry[]> {
    const base = apiBase(lang);
    return Promise.all(
        names.map(async (name) => {
            const def: ListSeed = LIST_SEEDS[name];
            const json = await apiGet(lang, def.path);
            return { queryKey: def.key(base, lang), data: json ? def.select(json) : undefined };
        })
    );
}

/** يلفّ صفحة قائمة: <SeedLists names={["seminars"]}><View /></SeedLists> */
export async function SeedLists({ names, children }: { names: ListSeedName[]; children: ReactNode }) {
    const lang = await getLang();
    const entries = await loadListSeeds(lang, names);
    return <SeedQueries entries={entries}>{children}</SeedQueries>;
}
