package com.datatech.rest.mongo
import org.mongodb.scala._
import org.bson.conversions.Bson
import org.mongodb.scala.result._
import com.datatech.sdp.mongo.engine._
import MGOClasses._
import MGOEngine._
import MGOCommands._
import com.datatech.sdp.result.DBOResult.DBOResult
object MongoRepo {
class MongoRepo[R](db:String, coll: String, converter: Option[Document => R])(implicit client: MongoClient) {
def getAll[R](next:Option[String],sort:Option[String],fields:Option[String],top:Option[Int]): DBOResult[Seq[R]] = {
var res = Seq[ResultOptions]()
next.foreach {b => res = res :+ ResultOptions(FOD_TYPE.FOD_FILTER,Some(Document(b)))}
sort.foreach {b => res = res :+ ResultOptions(FOD_TYPE.FOD_SORT,Some(Document(b)))}
fields.foreach {b => res = res :+ ResultOptions(FOD_TYPE.FOD_PROJECTION,Some(Document(b)))}
top.foreach {b => res = res :+ ResultOptions(FOD_TYPE.FOD_LIMIT,None,b)}
val ctxFind = MGOContext(dbName = db,collName=coll)
.setActionType(MGO_ACTION_TYPE.MGO_QUERY)
.setCommand(Find(andThen = res))
mgoQuery[Seq[R]](ctxFind,converter)
}
def query[R](filtr: Bson, next:Option[String]=None,sort:Option[String]=None,fields:Option[String]=None,top:Option[Int]=None): DBOResult[Seq[R]] = {
var res = Seq[ResultOptions]()
next.foreach {b => res = res :+ ResultOptions(FOD_TYPE.FOD_FILTER,Some(Document(b)))}
sort.foreach {b => res = res :+ ResultOptions(FOD_TYPE.FOD_SORT,Some(Document(b)))}
fields.foreach {b => res = res :+ ResultOptions(FOD_TYPE.FOD_PROJECTION,Some(Document(b)))}
top.foreach {b => res = res :+ ResultOptions(FOD_TYPE.FOD_LIMIT,None,b)}
val ctxFind = MGOContext(dbName = db,collName=coll)
.setActionType(MGO_ACTION_TYPE.MGO_QUERY)
.setCommand(Find(filter = Some(filtr),andThen = res))
mgoQuery[Seq[R]](ctxFind,converter)
}
import org.mongodb.scala.model.Filters._
def count(pid: String):DBOResult[Int] = {
val ctxCount = MGOContext(dbName = db,collName=coll)
.setActionType(MGO_ACTION_TYPE.MGO_QUERY)
.setCommand(Count(filter=Some(equal("pid",pid))))
mgoQuery[Int](ctxCount,None)
}
def getOneDocument(filtr: Bson): DBOResult[Document] = {
val ctxFind = MGOContext(dbName = db,collName=coll)
.setActionType(MGO_ACTION_TYPE.MGO_QUERY)
.setCommand(Find(filter = Some(filtr),firstOnly = true))
mgoQuery[Document](ctxFind,None)
}
def getOnePicture[R](pid: String, seqno: Int): DBOResult[R] = {
val ctxFind = MGOContext(dbName = db, collName = coll)
.setActionType(MGO_ACTION_TYPE.MGO_QUERY)
.setCommand(Find(filter = Some(and(equal("pid",pid),equal("seqno",seqno))), firstOnly = true))
mgoQuery[R](ctxFind, c