package net.pokeranalytics.android.model import io.realm.Realm import io.realm.RealmResults import io.realm.Sort import io.realm.kotlin.where import net.pokeranalytics.android.exceptions.PokerAnalyticsException import net.pokeranalytics.android.model.filter.FilterHelper import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.model.interfaces.Identifiable import net.pokeranalytics.android.model.realm.* sealed class Criteria { abstract class RealmCriteria : Criteria() { inline fun comparison(): List { return compare < QueryCondition.QueryDataCondition, T >() } } abstract class SimpleCriteria(private val condition:QueryCondition): Criteria() { fun comparison(): List { return listOf(condition) } } abstract class StaticCriteria : Criteria() { inline fun comparison(): List { QueryCondition.distinct()?.let { val values = it.mapNotNull { session -> when (this) { is Limits -> session.limit else -> null } } return compare(values) } return listOf() } } object Bankrolls: RealmCriteria() object Games: RealmCriteria() object TournamentNames: RealmCriteria() object Locations: RealmCriteria() object TournamentFeatures: RealmCriteria() object Limits: StaticCriteria() object TournamentTypes : StaticCriteria() object Tournament : SimpleCriteria(QueryCondition.TOURNAMENT) val queryConditions: List get() { return when (this) { is Bankrolls -> comparison() is Games -> comparison() is TournamentFeatures-> comparison() is TournamentNames-> comparison() is Locations -> comparison() is SimpleCriteria -> comparison() is Limits -> comparison() is TournamentTypes -> comparison() else -> throw PokerAnalyticsException.QueryTypeUnhandled } } companion object { inline fun < reified S : QueryCondition.QueryDataCondition, reified T : Identifiable > compare(): List { val objects = arrayListOf() val realm = Realm.getDefaultInstance() realm.where().findAll().forEach { objects.add((QueryCondition.getInstance() as S).apply { setObject(it) }) } realm.close() return objects } inline fun < reified S : QueryCondition.SingleValueQueryCondition > compare(values:List): List { val objects = arrayListOf() values.forEach { objects.add((S::class.java.newInstance()).apply { setValue(it) }) } return objects } } }