package callbacks

import (
	
	

	
	
	
	
)

func ( *gorm.DB) {
	if .Error == nil && .Statement.Schema != nil && !.Statement.SkipHooks && .Statement.Schema.BeforeDelete {
		callMethod(, func( interface{},  *gorm.DB) bool {
			if ,  := .(BeforeDeleteInterface);  {
				.AddError(.BeforeDelete())
				return true
			}

			return false
		})
	}
}

func ( *gorm.DB) {
	if .Error == nil && .Statement.Schema != nil {
		,  := .Statement.SelectAndOmitColumns(true, false)
		if ! {
			return
		}

		for ,  := range  {
			if ! {
				continue
			}

			,  := .Statement.Schema.Relationships.Relations[]
			if ! {
				continue
			}

			switch .Type {
			case schema.HasOne, schema.HasMany:
				 := .ToQueryConditions(.Statement.Context, .Statement.ReflectValue)
				 := reflect.New(.FieldSchema.ModelType).Interface()
				 := .Session(&gorm.Session{NewDB: true}).Model()
				 := false
				if .Statement.Unscoped {
					 = .Unscoped()
				}

				if len(.Statement.Selects) > 0 {
					 := make([]string, 0, len(.Statement.Selects))
					for ,  := range .Statement.Selects {
						if  == clause.Associations {
							 = append(, )
						} else if  :=  + "."; strings.HasPrefix(, ) {
							 = append(, strings.TrimPrefix(, ))
						}
					}

					if len() > 0 {
						 = .Select()
					}
				}

				for ,  := range  {
					if ,  := .(clause.IN);  && len(.Values) == 0 {
						 = true
						break
					}
				}

				if ! && .AddError(.Clauses(clause.Where{Exprs: }).Delete().Error) != nil {
					return
				}
			case schema.Many2Many:
				var (
					     = make([]clause.Expression, 0, len(.References))
					  = make([]*schema.Field, 0, len(.References))
					 = make([]string, 0, len(.References))
					     = reflect.New(.JoinTable.ModelType).Interface()
					          = .JoinTable.Table
					             = .Session(&gorm.Session{NewDB: true}).Model().Table()
				)

				for ,  := range .References {
					if .OwnPrimaryKey {
						 = append(, .PrimaryKey)
						 = append(, .ForeignKey.DBName)
					} else if .PrimaryValue != "" {
						 = append(, clause.Eq{
							Column: clause.Column{Table: .JoinTable.Table, Name: .ForeignKey.DBName},
							Value:  .PrimaryValue,
						})
					}
				}

				,  := schema.GetIdentityFieldValuesMap(.Statement.Context, .Statement.ReflectValue, )
				,  := schema.ToQueryValues(, , )
				 = append(, clause.IN{Column: , Values: })

				if .AddError(.Clauses(clause.Where{Exprs: }).Delete().Error) != nil {
					return
				}
			}
		}

	}
}

func ( *Config) func( *gorm.DB) {
	 := utils.Contains(.DeleteClauses, "RETURNING")

	return func( *gorm.DB) {
		if .Error != nil {
			return
		}

		if .Statement.Schema != nil {
			for ,  := range .Statement.Schema.DeleteClauses {
				.Statement.AddClause()
			}
		}

		if .Statement.SQL.Len() == 0 {
			.Statement.SQL.Grow(100)
			.Statement.AddClauseIfNotExists(clause.Delete{})

			if .Statement.Schema != nil {
				,  := schema.GetIdentityFieldValuesMap(.Statement.Context, .Statement.ReflectValue, .Statement.Schema.PrimaryFields)
				,  := schema.ToQueryValues(.Statement.Table, .Statement.Schema.PrimaryFieldDBNames, )

				if len() > 0 {
					.Statement.AddClause(clause.Where{Exprs: []clause.Expression{clause.IN{Column: , Values: }}})
				}

				if .Statement.ReflectValue.CanAddr() && .Statement.Dest != .Statement.Model && .Statement.Model != nil {
					_,  = schema.GetIdentityFieldValuesMap(.Statement.Context, reflect.ValueOf(.Statement.Model), .Statement.Schema.PrimaryFields)
					,  = schema.ToQueryValues(.Statement.Table, .Statement.Schema.PrimaryFieldDBNames, )

					if len() > 0 {
						.Statement.AddClause(clause.Where{Exprs: []clause.Expression{clause.IN{Column: , Values: }}})
					}
				}
			}

			.Statement.AddClauseIfNotExists(clause.From{})

			.Statement.Build(.Statement.BuildClauses...)
		}

		checkMissingWhereConditions()

		if !.DryRun && .Error == nil {
			,  := hasReturning(, )
			if ! {
				,  := .Statement.ConnPool.ExecContext(.Statement.Context, .Statement.SQL.String(), .Statement.Vars...)
				if .AddError() == nil {
					.RowsAffected, _ = .RowsAffected()
				}

				return
			}

			if ,  := .Statement.ConnPool.QueryContext(.Statement.Context, .Statement.SQL.String(), .Statement.Vars...); .AddError() == nil {
				gorm.Scan(, , )
				.AddError(.Close())
			}
		}
	}
}

func ( *gorm.DB) {
	if .Error == nil && .Statement.Schema != nil && !.Statement.SkipHooks && .Statement.Schema.AfterDelete {
		callMethod(, func( interface{},  *gorm.DB) bool {
			if ,  := .(AfterDeleteInterface);  {
				.AddError(.AfterDelete())
				return true
			}
			return false
		})
	}
}