import type { DB } from './db.js' import { isConfidentMatch } from './matcher.js' export type RipStatus = 'ripped' | 'not_ripped' /** * Resolution order per spec: * 1. manual rip_override (non-null) wins * 2. else a stored match_link means ripped * 3. else confident fuzzy match against the user's digital_albums */ export function resolveRipStatus(db: DB, userId: number, itemId: number): RipStatus { const item = db .prepare('SELECT id, title, artist, rip_override FROM collection_items WHERE id = ? AND user_id = ?') .get(itemId, userId) as | { id: number; title: string; artist: string; rip_override: number | null } | undefined if (!item) return 'not_ripped' if (item.rip_override !== null && item.rip_override !== undefined) { return item.rip_override === 1 ? 'ripped' : 'not_ripped' } const link = db.prepare('SELECT album_id FROM match_links WHERE item_id = ?').get(itemId) if (link) return 'ripped' const albums = db .prepare('SELECT title, artist FROM digital_albums WHERE user_id = ?') .all(userId) as { title: string; artist: string }[] return albums.some((a) => isConfidentMatch(item, a)) ? 'ripped' : 'not_ripped' }