import type { UnlinkedBookData, PotentialMatchData } from './types/api'; async function loadUnlinkedBooks(): Promise { const token = localStorage.getItem('token'); if (!token) return; try { const response = await fetch('/api/sync/unlinked-books', { headers: { 'Authorization': `Bearer ${token}` } }); if (response.ok) { const data = await response.json(); renderUnlinkedBooks(data.unlinked || []); } } catch (error) { console.error('Failed to load unlinked books:', error); } } function renderUnlinkedBooks(books: UnlinkedBookData[]): void { const container = document.getElementById('unlinked-books-list'); if (!container) return; if (books.length === 0) { container.innerHTML = '

No unlinked books

'; return; } container.innerHTML = books.map(book => `

${book.title_from_device}

${book.device_name} (${book.device_type})

${book.file_path}

Confidence: ${Math.round(book.confidence_score * 100)}%

${book.potential_matches && book.potential_matches.length > 0 ? `

Potential Matches:

${book.potential_matches.slice(0, 3).map(match => `

${match.title}

${match.author} (${Math.round(match.confidence * 100)}%)

`).join('')}
` : ''}
`).join(''); } async function linkBook(progressId: string, mediaItemId: string): Promise { const token = localStorage.getItem('token'); if (!token) return; try { const response = await fetch('/api/sync/link-book', { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ progress_id: progressId, media_item_id: mediaItemId }) }); if (response.ok) { if ((window as any).showToast?.success) { (window as any).showToast.success('Book linked successfully'); } loadUnlinkedBooks(); } else { const error = await response.json(); if ((window as any).showToast?.error) { (window as any).showToast.error(error.error || 'Failed to link book'); } } } catch (error) { console.error('Failed to link book:', error); if ((window as any).showToast?.error) { (window as any).showToast.error('Failed to link book'); } } } async function autoLinkBooks(): Promise { const token = localStorage.getItem('token'); if (!token) return; if (!confirm('Auto-link all books with high confidence matches?')) return; try { const response = await fetch('/api/sync/auto-link', { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ confidence_threshold: 0.9 }) }); if (response.ok) { const data = await response.json(); if ((window as any).showToast?.success) { (window as any).showToast.success(`Auto-linked ${data.linked_count || 0} books`); } loadUnlinkedBooks(); } } catch (error) { console.error('Failed to auto-link:', error); if ((window as any).showToast?.error) { (window as any).showToast.error('Failed to auto-link books'); } } } async function getSuggestions(progressId: string): Promise { const token = localStorage.getItem('token'); if (!token) return; try { const response = await fetch(`/api/sync/suggestions/${progressId}`, { headers: { 'Authorization': `Bearer ${token}` } }); if (response.ok) { const suggestions = await response.json(); showSuggestionsModal(progressId, suggestions); } } catch (error) { console.error('Failed to get suggestions:', error); } } function showSuggestionsModal(progressId: string, suggestions: PotentialMatchData[]): void { const modal = document.getElementById('match-modal'); const content = document.getElementById('match-modal-content'); if (!modal || !content) return; content.innerHTML = `

Select a match

${suggestions.map(s => `

${s.title}

${s.author}

${Math.round(s.confidence * 100)}% match

`).join('')}
`; modal.classList.remove('hidden'); } function hideMatchModal(): void { const modal = document.getElementById('match-modal'); if (modal) { modal.classList.add('hidden'); } } (window as any).loadUnlinkedBooks = loadUnlinkedBooks; (window as any).linkBook = linkBook; (window as any).autoLinkBooks = autoLinkBooks; (window as any).getSuggestions = getSuggestions; (window as any).showSuggestionsModal = showSuggestionsModal; (window as any).hideMatchModal = hideMatchModal;