app/src/main/java/com/github/studydistractor/sdp/distractionStat/DistractionStatServiceFirebase.kt
package com.github.studydistractor.sdp.distractionStat
import com.google.android.gms.tasks.Task
import com.google.android.gms.tasks.Tasks
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.database.FirebaseDatabase
import java.lang.Exception
import javax.inject.Inject
class DistractionStatServiceFirebase @Inject constructor(feedbackPath: String, likesPath: String, dislikesPath: String, tagsPath: String) : DistractionStatModel {
private val pathFeedback = feedbackPath
private val pathLikes = likesPath
private val pathDislikes = dislikesPath
private val pathTags = tagsPath // "TagsUsers"
private val db = FirebaseDatabase.getInstance()
private val auth = FirebaseAuth.getInstance()
override fun fetchDistractionFeedback(did: String): Task<List<String>> {
return db.getReference(pathFeedback).child(did).get().onSuccessTask { t->
val feedbacks= arrayListOf<String>()
for(id in t.children) {
for(child in id.children){
val feedback = child.getValue(String::class.java)
if(feedback != null) {
feedbacks.add(feedback)
}
}
}
Tasks.forResult(feedbacks)
}
}
override fun fetchDistractionTags(did: String): Task<List<String>> {
return db.getReference(pathTags).child(did).get().onSuccessTask { t->
val tags = arrayListOf<String>()
for(id in t.children) {
val tag = id.getValue(String::class.java)
if(tag != null) {
tags.add(tag)
}
}
Tasks.forResult(tags)
}
}
override fun fetchLikeCount(did: String): Task<Int> {
return db.getReference(pathLikes).child(did).get().onSuccessTask {
t -> Tasks.forResult(t.children.count())
}
}
override fun fetchDislikeCount(did: String): Task<Int> {
return db.getReference(pathDislikes).child(did).get().onSuccessTask {
t -> Tasks.forResult(t.children.count())
}
}
override fun postNewFeedback(did: String, feedback: String) : Task<Void>{
if(feedback.isEmpty()) throw IllegalArgumentException()
val uid = auth.uid ?: return Tasks.forException(Exception("Not login"))
return db.getReference(pathFeedback)
.child(did)
.child(uid)
.child(feedback)
.setValue(feedback)
}
override fun postLike(did: String) : Task<Void> {
val uid = auth.uid ?: return Tasks.forException(Exception("Not login"))
return db.getReference(pathDislikes).child(did).child(uid).get().continueWithTask{
j ->
if(j.isSuccessful && j.result.value == uid){
db.getReference(pathDislikes).child(did).child(uid).removeValue()
}
db.getReference(pathLikes).child(did).child(uid).get().continueWithTask{
i ->
if(i.result.value == uid){
db.getReference(pathLikes).child(did).child(uid).removeValue()
}
db.getReference(pathLikes).child(did).child(uid).setValue(uid)
}
}
}
override fun postDislike(did: String) : Task<Void>{
val uid = auth.uid ?: return Tasks.forException(Exception("Not login"))
return db.getReference(pathLikes).child(did).child(uid).get().continueWithTask{
j ->
if(j.isSuccessful && j.result.value == uid){
db.getReference(pathLikes).child(did).child(uid).removeValue()
}
db.getReference(pathDislikes).child(did).child(uid).get().continueWithTask{
i ->
if(i.result.value == uid){
db.getReference(pathDislikes).child(did).child(uid).removeValue()
}
db.getReference(pathDislikes).child(did).child(uid).setValue(uid)
}
}
}
override fun addTag(did: String, tag: String): Task<Void> {
return db.getReference(pathTags).child(did).child(tag).setValue(tag)
}
}