package net.pokeranalytics.android.model.filter

import io.realm.Realm
import io.realm.RealmObject
import io.realm.RealmQuery
import io.realm.RealmResults
import net.pokeranalytics.android.model.filter.interfaces.Filterable

/**
 * We want to be able to store filters in the database:
 * - filters can be a combination of sub filters
 * - filters can be applied to different type of objects: Sessions, Hands, Transactions...
 * - filters can be applied to a list of different type of objects (feed)
 *
 * A filter is described by the following:
 * - a data type: Session, Hands...
 * - a field: table size of a Session
 * - an operator: equal, >=, <...
 * - a value: an id, a number, a date...
 *
 * We can decide to have a collection of [operator, value] for a field
 *
 * Combination:
 * - multiple datatype filters should be handled as 'OR'
 * - multiple field filters should be handled as 'AND'
 * - multiple '=' filters as 'OR'
 * - multiple 'Greater than', 'less than' as 'AND'
 * - multiple values as 'OR'
 *
 * Also:
 * A filter should be able to be converted into a Realm query
 *
 */

class FilterManager {
    fun filter(realm:Realm, relatedEntity: Class<out RealmObject>, queries:List<Filterable>): RealmResults<*> {
        var realmQuery : RealmQuery<out RealmObject> = realm.where(relatedEntity)
        queries.forEach {
            realmQuery = (it.filter(realmQuery))
        }
        return realmQuery.findAll()
    }
}
//
//fun MutableList<Filterable>.filter(filter: FilterComponent) : List<Filterable> {
//
//    return this.filter { f ->
//        return@filter true
//    }
//}


// doesnt compile: Class "FilterableRealmObject" must contain at least 1 persistable field.

//class FilterableRealmObject : RealmObject(), Filterable {
//
//}