import jokesJson from '../../data/jokes/local-jokes.json' with { type: 'json' };
import type { JokeProvider, JokeProviderResult } from './types.js';
import type { JokePreferences, Category, Lang } from '../validation.js';
interface LocalJoke {
id: string;
lang: Lang;
category: Category;
text: string;
}
const jokes = (jokesJson as LocalJoke[]) satisfies LocalJoke[];
export const getJoke: JokeProvider['getJoke'] = async (preferences: JokePreferences): Promise<JokeProviderResult> => {
const { category, lang } = preferences;
const candidates = filterCandidates(category, lang);
if (candidates.length === 0) {
throw new Error('No local jokes available for the given filters');
}
const chosen = pickRandom(candidates);
return {
text: chosen.text,
category: chosen.category,
source: 'local-fallback',
};
};
function filterCandidates(category: Category, lang: Lang): LocalJoke[] {
const normalizedCategory = category ? String(category).trim().toLowerCase() : undefined;
const normalizedLang = lang ? String(lang).trim().toLowerCase() : undefined;
const primary = jokes.filter((joke) =>
(!normalizedCategory || joke.category === normalizedCategory) &&
(!normalizedLang || joke.lang === normalizedLang),
);
if (primary.length > 0) {
return primary;
}
if (normalizedLang) {
const sameLang = jokes.filter((joke) => joke.lang === normalizedLang);
if (sameLang.length > 0) {
return sameLang;
}
}
return jokes;
}
function pickRandom<T>(items: T[]): T {
const index = Math.floor(Math.random() * items.length);
return items[index];
}