package callbacks

import (
	
)

var (
	createClauses = []string{"INSERT", "VALUES", "ON CONFLICT"}
	queryClauses  = []string{"SELECT", "FROM", "WHERE", "GROUP BY", "ORDER BY", "LIMIT", "FOR"}
	updateClauses = []string{"UPDATE", "SET", "WHERE"}
	deleteClauses = []string{"DELETE", "FROM", "WHERE"}
)

type Config struct {
	LastInsertIDReversed bool
	CreateClauses        []string
	QueryClauses         []string
	UpdateClauses        []string
	DeleteClauses        []string
}

func ( *gorm.DB,  *Config) {
	 := func( *gorm.DB) bool {
		return !.SkipDefaultTransaction
	}

	if len(.CreateClauses) == 0 {
		.CreateClauses = createClauses
	}
	if len(.QueryClauses) == 0 {
		.QueryClauses = queryClauses
	}
	if len(.DeleteClauses) == 0 {
		.DeleteClauses = deleteClauses
	}
	if len(.UpdateClauses) == 0 {
		.UpdateClauses = updateClauses
	}

	 := .Callback().Create()
	.Match().Register("gorm:begin_transaction", BeginTransaction)
	.Register("gorm:before_create", BeforeCreate)
	.Register("gorm:save_before_associations", SaveBeforeAssociations(true))
	.Register("gorm:create", Create())
	.Register("gorm:save_after_associations", SaveAfterAssociations(true))
	.Register("gorm:after_create", AfterCreate)
	.Match().Register("gorm:commit_or_rollback_transaction", CommitOrRollbackTransaction)
	.Clauses = .CreateClauses

	 := .Callback().Query()
	.Register("gorm:query", Query)
	.Register("gorm:preload", Preload)
	.Register("gorm:after_query", AfterQuery)
	.Clauses = .QueryClauses

	 := .Callback().Delete()
	.Match().Register("gorm:begin_transaction", BeginTransaction)
	.Register("gorm:before_delete", BeforeDelete)
	.Register("gorm:delete_before_associations", DeleteBeforeAssociations)
	.Register("gorm:delete", Delete())
	.Register("gorm:after_delete", AfterDelete)
	.Match().Register("gorm:commit_or_rollback_transaction", CommitOrRollbackTransaction)
	.Clauses = .DeleteClauses

	 := .Callback().Update()
	.Match().Register("gorm:begin_transaction", BeginTransaction)
	.Register("gorm:setup_reflect_value", SetupUpdateReflectValue)
	.Register("gorm:before_update", BeforeUpdate)
	.Register("gorm:save_before_associations", SaveBeforeAssociations(false))
	.Register("gorm:update", Update())
	.Register("gorm:save_after_associations", SaveAfterAssociations(false))
	.Register("gorm:after_update", AfterUpdate)
	.Match().Register("gorm:commit_or_rollback_transaction", CommitOrRollbackTransaction)
	.Clauses = .UpdateClauses

	 := .Callback().Row()
	.Register("gorm:row", RowQuery)
	.Clauses = .QueryClauses

	 := .Callback().Raw()
	.Register("gorm:raw", RawExec)
	.Clauses = .QueryClauses
}