__PACKAGE__

import io.getquill.NamingStrategy
import io.getquill.context.jdbc.JdbcContext
import io.getquill.context.sql.idiom.SqlIdiom
__BEAN_CLASS_IMPORT__
__ID_CLASS_IMPORT__
__REPOSITORY_TRAIT_IMPORT__
import pl.jozwik.quillgeneric.quillmacro.sync.QuillCrudWithContext
__REPOSITORY_IMPORT__

import scala.util.Try

final class __REPOSITORY_NAME__[Dialect <: SqlIdiom, Naming <: NamingStrategy](
    protected val context: JdbcContext[Dialect, Naming] with QuillCrudWithContext,
    protected val tableName: String = "__TABLE_NAME__"
)
  extends __REPOSITORY_TRAIT_SIMPLE_NAME__  {

  protected def dynamicSchema: context.DynamicEntityQuery[__BEAN__] = dSchema

  private implicit val dSchema: context.DynamicEntityQuery[__BEAN__] = {
      __IMPORT_CONTEXT__
      context.dynamicQuerySchema[__BEAN__](tableName__COLUMN_MAPPING__)
    }

  override def all: Try[Seq[__BEAN__]] =
    context.all[__BEAN__]

  override def create(entity: __BEAN__, generateId: Boolean = false): Try[__ID__] =
    if (generateId) {
      context.createAndGenerateId[__ID__, __BEAN__](entity)
    } else {
      context.create[__ID__, __BEAN__](entity)
    }

  override def read(id: __ID__): Try[Option[__BEAN__]] =
    context.read[__ID__, __BEAN__](id)

  override def createOrUpdate(entity: __BEAN__, generateId: Boolean = false): Try[__ID__] =
    context.createOrUpdate[__ID__, __BEAN__](entity, generateId)

  override def update(entity: __BEAN__): Try[Long] =
    context.update[__BEAN__](entity)

  override def delete(id: __ID__): Try[Boolean] =
    context.deleteByFilter[__BEAN__](_.id == id)

}
