// Typed wrappers over the Tauri command bridge into mtgc-core. import { invoke } from "@tauri-apps/api/core"; // --- Types (mirror the serde-serialized core structs) --------------------- export interface CardRef { oracle_id: string; name: string; mana_value: number; colors: number; // WUBRG bitmask color_identity: number; // WUBRG bitmask type_line: string; image_uri: string; // Scryfall "normal" image URL, or "" if unavailable } export interface LibraryCard extends CardRef { quantity_owned: number; decks: string[]; quantity_assigned: number; location: string; } export interface DeckEntry extends CardRef { quantity: number; is_commander: boolean; quantity_owned: number; } export interface Deck { id: number; name: string; format: string; commander_oracle_id: string | null; notes: string; } export interface LibraryFilter { text?: string | null; colors_exact?: number | null; colors_include?: number | null; commander_identity?: number | null; cmc_min?: number | null; cmc_max?: number | null; types?: string[]; subtypes?: string[]; keywords?: string[]; in_deck?: number | null; } export interface Status { library_path: string; reference_path: string; reference_ready: boolean; card_count: number; } export interface IngestStageInfo { id: string; label: string; weight: number; // fraction of total work, 0..1, sums to 1 across all stages } export interface IngestProgress { stage: "index" | "oracle" | "printings" | "optimize" | string; message: string; overall_percent: number; // 0..100 cumulative across all stages stages: IngestStageInfo[]; } // --- WUBRG bitmask helpers ------------------------------------------------ export const COLORS: { bit: number; code: string; label: string }[] = [ { bit: 1, code: "W", label: "White" }, { bit: 2, code: "U", label: "Blue" }, { bit: 4, code: "B", label: "Black" }, { bit: 8, code: "R", label: "Red" }, { bit: 16, code: "G", label: "Green" }, ]; export function maskToLetters(mask: number): string { return COLORS.filter((c) => mask & c.bit) .map((c) => c.code) .join(""); } // --- Commands ------------------------------------------------------------- export const api = { getStatus: () => invoke("get_status"), setLibraryPath: (path: string) => invoke("set_library_path", { path }), updateCardData: () => invoke("update_card_data"), cancelUpdateCardData: () => invoke("cancel_update_card_data"), searchCards: (query: string, limit = 20) => invoke("search_cards", { query, limit }), addOwned: (oracleId: string, delta: number) => invoke("add_owned", { oracleId, delta }), setOwned: (oracleId: string, quantity: number) => invoke("set_owned", { oracleId, quantity }), setLocation: (oracleId: string, location: string) => invoke("set_location", { oracleId, location }), searchLibrary: (filter: LibraryFilter) => invoke("search_library", { filter }), listDecks: () => invoke("list_decks"), createDeck: (name: string, commanderOracleId: string | null) => invoke("create_deck", { name, commanderOracleId }), deleteDeck: (deckId: number) => invoke("delete_deck", { deckId }), setDeckFormat: (deckId: number, format: string) => invoke("set_deck_format", { deckId, format }), setDeckCommander: (deckId: number, oracleId: string | null) => invoke("set_deck_commander", { deckId, oracleId }), setDeckCard: ( deckId: number, oracleId: string, quantity: number, isCommander = false, ) => invoke("set_deck_card", { deckId, oracleId, quantity, isCommander }), deckContents: (deckId: number) => invoke("deck_contents", { deckId }), cardDecks: (oracleId: string) => invoke("card_decks", { oracleId }), };