import { json } from '@sveltejs/kit';
import type { WikiSummary } from '$lib/types';
import type { RequestHandler } from './$types';

const USER_AGENT = 'JWE-OKI/2.0 (https://labola.o-k-i.net/ORGANISATION-KA-INTERNATIONALE/JWE; contact OKI)';
const TTL_MS = 24 * 60 * 60 * 1000; // 24 h

const cache = new Map<string, { expires: number; summary: WikiSummary }>();

interface WbEntity {
	labels?: { fr?: { value: string } };
	sitelinks?: { frwiki?: { title: string } };
}

interface WbResponse {
	entities?: Record<string, WbEntity>;
}

interface RestSummary {
	title?: string;
	extract?: string;
	content_urls?: { desktop?: { page?: string } };
	thumbnail?: { source?: string };
}

/** GET /api/wiki/[qid] → extrait Wikipédia FR normalisé (404 si pas de sitelink fr). */
export const GET: RequestHandler = async ({ params, fetch }) => {
	const qid = params.qid;
	if (!/^Q\d+$/.test(qid)) {
		return json({ erreur: 'Identifiant Wikidata invalide' }, { status: 400 });
	}

	const cached = cache.get(qid);
	if (cached && cached.expires > Date.now()) {
		return json(cached.summary, { headers: { 'Cache-Control': 'public, max-age=3600' } });
	}

	const headers = { 'User-Agent': USER_AGENT, Accept: 'application/json' };

	// 1. Wikidata : sitelink frwiki (+ libellé fr en fallback)
	const wbUrl = `https://www.wikidata.org/w/api.php?action=wbgetentities&ids=${encodeURIComponent(qid)}&props=sitelinks%7Clabels&sitefilter=frwiki&languages=fr&format=json`;
	let entity: WbEntity | undefined;
	try {
		const res = await fetch(wbUrl, { headers });
		if (!res.ok) throw new Error(`wikidata ${res.status}`);
		entity = ((await res.json()) as WbResponse).entities?.[qid];
	} catch {
		return json({ erreur: 'Wikidata injoignable' }, { status: 502 });
	}

	const titre = entity?.sitelinks?.frwiki?.title;
	if (!titre) {
		// Pas de page Wikipédia FR → le front bascule sur l'écran « Pwen blindé ».
		return json({ erreur: 'Pas de page Wikipédia en français' }, { status: 404 });
	}

	// 2. Wikipédia FR : résumé de l'article
	let data: RestSummary;
	try {
		const res = await fetch(
			`https://fr.wikipedia.org/api/rest_v1/page/summary/${encodeURIComponent(titre)}`,
			{ headers }
		);
		if (res.status === 404) return json({ erreur: 'Article introuvable' }, { status: 404 });
		if (!res.ok) throw new Error(`wikipedia ${res.status}`);
		data = (await res.json()) as RestSummary;
	} catch {
		return json({ erreur: 'Wikipédia injoignable' }, { status: 502 });
	}

	const summary: WikiSummary = {
		qid,
		title: data.title ?? titre,
		extract: data.extract ?? '',
		url: data.content_urls?.desktop?.page ?? `https://fr.wikipedia.org/wiki/${encodeURIComponent(titre)}`,
		thumbnail: data.thumbnail?.source ?? null
	};
	cache.set(qid, { expires: Date.now() + TTL_MS, summary });

	return json(summary, { headers: { 'Cache-Control': 'public, max-age=3600' } });
};
