import type { OverviewData, DailyRollup, MonthlyRollup, SessionSummary, SessionTimelinePoint, SessionEvent, VocabularyEntry, KanjiEntry, VocabularyOccurrenceEntry, MediaLibraryItem, MediaDetailData, AnimeLibraryItem, AnimeDetailData, AnimeWord, StreakCalendarDay, EpisodesPerDay, NewAnimePerDay, WatchTimePerAnime, WordDetailData, KanjiDetailData, EpisodeDetailData, } from '../types/stats'; interface StatsElectronAPI { stats: { getOverview: () => Promise; getDailyRollups: (limit?: number) => Promise; getMonthlyRollups: (limit?: number) => Promise; getSessions: (limit?: number) => Promise; getSessionTimeline: (id: number, limit?: number) => Promise; getSessionEvents: (id: number, limit?: number) => Promise; getVocabulary: (limit?: number) => Promise; getWordOccurrences: ( headword: string, word: string, reading: string, limit?: number, offset?: number, ) => Promise; getKanji: (limit?: number) => Promise; getKanjiOccurrences: ( kanji: string, limit?: number, offset?: number, ) => Promise; getMediaLibrary: () => Promise; getMediaDetail: (videoId: number) => Promise; getAnimeLibrary: () => Promise; getAnimeDetail: (animeId: number) => Promise; getAnimeWords: (animeId: number, limit?: number) => Promise; getAnimeRollups: (animeId: number, limit?: number) => Promise; getAnimeCoverUrl: (animeId: number) => string; getStreakCalendar: (days?: number) => Promise; getEpisodesPerDay: (limit?: number) => Promise; getNewAnimePerDay: (limit?: number) => Promise; getWatchTimePerAnime: (limit?: number) => Promise; getWordDetail: (wordId: number) => Promise; getKanjiDetail: (kanjiId: number) => Promise; getEpisodeDetail: (videoId: number) => Promise; ankiBrowse: (noteId: number) => Promise; ankiNotesInfo: ( noteIds: number[], ) => Promise }>>; hideOverlay: () => void; }; } declare global { interface Window { electronAPI?: StatsElectronAPI; } } function getIpc(): StatsElectronAPI['stats'] { const api = window.electronAPI?.stats; if (!api) throw new Error('Electron IPC not available'); return api; } export const ipcClient = { getOverview: () => getIpc().getOverview(), getDailyRollups: (limit = 60) => getIpc().getDailyRollups(limit), getMonthlyRollups: (limit = 24) => getIpc().getMonthlyRollups(limit), getSessions: (limit = 50) => getIpc().getSessions(limit), getSessionTimeline: (id: number, limit?: number) => getIpc().getSessionTimeline(id, limit), getSessionEvents: (id: number, limit = 500) => getIpc().getSessionEvents(id, limit), getVocabulary: (limit = 100) => getIpc().getVocabulary(limit), getWordOccurrences: (headword: string, word: string, reading: string, limit = 50, offset = 0) => getIpc().getWordOccurrences(headword, word, reading, limit, offset), getKanji: (limit = 100) => getIpc().getKanji(limit), getKanjiOccurrences: (kanji: string, limit = 50, offset = 0) => getIpc().getKanjiOccurrences(kanji, limit, offset), getMediaLibrary: () => getIpc().getMediaLibrary(), getMediaDetail: (videoId: number) => getIpc().getMediaDetail(videoId), getAnimeLibrary: () => getIpc().getAnimeLibrary(), getAnimeDetail: (animeId: number) => getIpc().getAnimeDetail(animeId), getAnimeWords: (animeId: number, limit = 50) => getIpc().getAnimeWords(animeId, limit), getAnimeRollups: (animeId: number, limit = 90) => getIpc().getAnimeRollups(animeId, limit), getAnimeCoverUrl: (animeId: number) => getIpc().getAnimeCoverUrl(animeId), getStreakCalendar: (days = 90) => getIpc().getStreakCalendar(days), getEpisodesPerDay: (limit = 90) => getIpc().getEpisodesPerDay(limit), getNewAnimePerDay: (limit = 90) => getIpc().getNewAnimePerDay(limit), getWatchTimePerAnime: (limit = 90) => getIpc().getWatchTimePerAnime(limit), getWordDetail: (wordId: number) => getIpc().getWordDetail(wordId), getKanjiDetail: (kanjiId: number) => getIpc().getKanjiDetail(kanjiId), getEpisodeDetail: (videoId: number) => getIpc().getEpisodeDetail(videoId), ankiBrowse: (noteId: number) => getIpc().ankiBrowse(noteId), ankiNotesInfo: (noteIds: number[]) => getIpc().ankiNotesInfo(noteIds), };