import type { DeckCard, DeckCategory, TcgDeck } from '#lib/content'; import { findCardByName } from './api'; import { categoryOrder, categoryTitles } from './cardKind'; import { toBuilderCard, type BuilderEntry } from './deckBuilder.svelte'; import type { TcgCard } from './types'; export interface DeckSection { category: DeckCategory; title: string; total: number; cards: DeckCard[]; } const lookups = new Map>(); export function deckCardKey(card: DeckCard): string { return `${card.name}|${card.set ?? ''}`; } export function deckSections(deck: TcgDeck): DeckSection[] { return categoryOrder .map((category) => { const cards = deck.cards.filter((card) => card.category === category); return { category, title: categoryTitles[category], total: cards.reduce((sum, card) => sum + card.count, 0), cards }; }) .filter((section) => section.cards.length > 0); } export function deckTotal(deck: TcgDeck): number { return deck.cards.reduce((sum, card) => sum + card.count, 0); } export function lookUpDeckCard(card: DeckCard): Promise { const key = deckCardKey(card); const existing = lookups.get(key); if (existing) return existing; const lookup = findCardByName(card.name, card.set).catch((error) => { lookups.delete(key); throw error; }); lookups.set(key, lookup); return lookup; } export async function deckBuilderEntries(deck: TcgDeck): Promise { const entries: BuilderEntry[] = []; for (const deckCard of deck.cards) { const card = await lookUpDeckCard(deckCard).catch(() => null); if (card) entries.push({ card: toBuilderCard(card), count: deckCard.count }); } return entries; }