package ru.notesapp.data
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
import ru.notesapp.data.local.NoteDao
import ru.notesapp.data.local.toDomain
import ru.notesapp.data.local.toEntity
import ru.notesapp.data.remote.NetworkResult
import ru.notesapp.data.remote.NoteApi
import ru.notesapp.data.remote.safeApiCall
import ru.notesapp.data.remote.toDto
import ru.notesapp.data.remote.toEntity
import ru.notesapp.domain.Note
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class SyncedNotesRepository @Inject constructor(
private val dao: NoteDao,
private val api: NoteApi,
) : NotesRepository {
override fun observeAll(): Flow<List<Note>> =
dao.observeAll().map { list -> list.map { it.toDomain() } }
override suspend fun refresh(): NetworkResult<Unit> = safeApiCall {
val remote = api.listPosts()
dao.insertAll(remote.map { it.toEntity() })
Unit
}
override suspend fun add(note: Note): NetworkResult<Long> = safeApiCall {
dao.insert(note.toEntity())
}
override suspend fun update(note: Note): NetworkResult<Unit> = safeApiCall {
dao.update(note.toEntity())
Unit
}
override suspend fun delete(id: Long): NetworkResult<Unit> = safeApiCall {
api.deletePost(id)
dao.deleteById(id)
Unit
}
override suspend fun getById(id: Long): Note? =
dao.getById(id)?.toDomain()
override fun search(query: String): Flow<List<Note>> =
dao.searchByTitle(query).map { list -> list.map { it.toDomain() } }
}