package oppen.ariane.io.database.bookmarks import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import oppen.ariane.io.database.ArianeAbstractDatabase import java.net.URI class ArianeBookmarks(private val db: ArianeAbstractDatabase): BookmarksDatasource { override fun get(onBookmarks: (List) -> Unit) { GlobalScope.launch(Dispatchers.IO){ val dbBookmarks = db.bookmarks().getAll() val bookmarks = mutableListOf() dbBookmarks.forEach { bookmarkEntity -> bookmarks.add( BookmarkEntry( uid = bookmarkEntity.uid, label = bookmarkEntity.label ?: "Unknown", uri = URI.create(bookmarkEntity.uri), index = bookmarkEntity.uiIndex ?: 0) ) } onBookmarks(bookmarks) } } override fun add(bookmarkEntry: BookmarkEntry, onAdded: () -> Unit) { GlobalScope.launch(Dispatchers.IO){ val bookmarkEntity = BookmarkEntity( label = bookmarkEntry.label, uri = bookmarkEntry.uri.toString(), uiIndex = bookmarkEntry.index, folder = "~/") db.bookmarks().insertAll(bookmarkEntity) onAdded() } } override fun moveUp(bookmarkEntry: BookmarkEntry, onMoved: () -> Unit) { GlobalScope.launch(Dispatchers.IO){ //todo - this method is broken: val prev = db.bookmarks().getBookmark(bookmarkEntry.index -1) val target = db.bookmarks().getBookmark(bookmarkEntry.index) db.bookmarks().updateUIIndex(prev.uid, bookmarkEntry.index) db.bookmarks().updateUIIndex(target.uid, bookmarkEntry.index - 1) onMoved() } } override fun moveDown(bookmarkEntry: BookmarkEntry, onMoved: () -> Unit) { GlobalScope.launch(Dispatchers.IO){ val next = db.bookmarks().getBookmark(bookmarkEntry.index + 1) val target = db.bookmarks().getBookmark(bookmarkEntry.index) db.bookmarks().updateUIIndex(next.uid, bookmarkEntry.index) db.bookmarks().updateUIIndex(target.uid, bookmarkEntry.index + 1) onMoved() } } override fun update(bookmarkEntry: BookmarkEntry, label: String?, uri: String?, onUpdate: () -> Unit) { GlobalScope.launch(Dispatchers.IO){ db.bookmarks().updateContent(bookmarkEntry.uid, label ?: "", uri ?: "") onUpdate() } } override fun delete(bookmarkEntry: BookmarkEntry, onDelete: () -> Unit) { GlobalScope.launch(Dispatchers.IO){ val entity = db.bookmarks().getBookmark(bookmarkEntry.index) db.bookmarks().delete(entity) onDelete() } } }