package bun

import (
	
	
	

	
	
	
)

type DeleteQuery struct {
	whereBaseQuery
	returningQuery
}

func ( *DB) *DeleteQuery {
	 := &DeleteQuery{
		whereBaseQuery: whereBaseQuery{
			baseQuery: baseQuery{
				db:   ,
				conn: .DB,
			},
		},
	}
	return 
}

func ( *DeleteQuery) ( IConn) *DeleteQuery {
	.setConn()
	return 
}

func ( *DeleteQuery) ( interface{}) *DeleteQuery {
	.setTableModel()
	return 
}

// Apply calls the fn passing the DeleteQuery as an argument.
func ( *DeleteQuery) ( func(*DeleteQuery) *DeleteQuery) *DeleteQuery {
	return ()
}

func ( *DeleteQuery) ( string,  schema.QueryAppender) *DeleteQuery {
	.addWith(, )
	return 
}

func ( *DeleteQuery) ( ...string) *DeleteQuery {
	for ,  := range  {
		.addTable(schema.UnsafeIdent())
	}
	return 
}

func ( *DeleteQuery) ( string,  ...interface{}) *DeleteQuery {
	.addTable(schema.SafeQuery(, ))
	return 
}

func ( *DeleteQuery) ( string,  ...interface{}) *DeleteQuery {
	.modelTable = schema.SafeQuery(, )
	return 
}

//------------------------------------------------------------------------------

func ( *DeleteQuery) () *DeleteQuery {
	.flags = .flags.Set(wherePKFlag)
	return 
}

func ( *DeleteQuery) ( string,  ...interface{}) *DeleteQuery {
	.addWhere(schema.SafeQueryWithSep(, , " AND "))
	return 
}

func ( *DeleteQuery) ( string,  ...interface{}) *DeleteQuery {
	.addWhere(schema.SafeQueryWithSep(, , " OR "))
	return 
}

func ( *DeleteQuery) ( string,  func(*DeleteQuery) *DeleteQuery) *DeleteQuery {
	 := .where
	.where = nil

	 = ()

	 := .where
	.where = 

	.addWhereGroup(, )

	return 
}

func ( *DeleteQuery) () *DeleteQuery {
	.whereDeleted()
	return 
}

func ( *DeleteQuery) () *DeleteQuery {
	.whereAllWithDeleted()
	return 
}

func ( *DeleteQuery) () *DeleteQuery {
	.flags = .flags.Set(forceDeleteFlag)
	return 
}

//------------------------------------------------------------------------------

// Returning adds a RETURNING clause to the query.
//
// To suppress the auto-generated RETURNING clause, use `Returning("NULL")`.
func ( *DeleteQuery) ( string,  ...interface{}) *DeleteQuery {
	.addReturning(schema.SafeQuery(, ))
	return 
}

func ( *DeleteQuery) () bool {
	if !.db.features.Has(feature.Returning) {
		return false
	}
	return .returningQuery.hasReturning()
}

//------------------------------------------------------------------------------

func ( *DeleteQuery) () string {
	return "DELETE"
}

func ( *DeleteQuery) ( schema.Formatter,  []byte) ( []byte,  error) {
	if .err != nil {
		return nil, .err
	}
	 = formatterWithModel(, )

	if .isSoftDelete() {
		 := time.Now()

		if  := .tableModel.updateSoftDeleteField();  != nil {
			return nil, 
		}

		 := &UpdateQuery{
			whereBaseQuery: .whereBaseQuery,
			returningQuery: .returningQuery,
		}
		.Set(.softDeleteSet(, ))

		return .AppendQuery(, )
	}

	 = .WhereDeleted()
	 := .db.features.Has(feature.DeleteTableAlias)

	,  = .appendWith(, )
	if  != nil {
		return nil, 
	}

	 = append(, "DELETE FROM "...)

	if  {
		,  = .appendFirstTableWithAlias(, )
	} else {
		,  = .appendFirstTable(, )
	}
	if  != nil {
		return nil, 
	}

	if .hasMultiTables() {
		 = append(, " USING "...)
		,  = .appendOtherTables(, )
		if  != nil {
			return nil, 
		}
	}

	,  = .mustAppendWhere(, , )
	if  != nil {
		return nil, 
	}

	if len(.returning) > 0 {
		,  = .appendReturning(, )
		if  != nil {
			return nil, 
		}
	}

	return , nil
}

func ( *DeleteQuery) () bool {
	return .tableModel != nil && .table.SoftDeleteField != nil && !.flags.Has(forceDeleteFlag)
}

func ( *DeleteQuery) ( schema.Formatter,  time.Time) string {
	 := make([]byte, 0, 32)
	if .HasFeature(feature.UpdateMultiTable) {
		 = append(, .table.SQLAlias...)
		 = append(, '.')
	}
	 = append(, .table.SoftDeleteField.SQLName...)
	 = append(, " = "...)
	 = .db.Dialect().Append(, , )
	return internal.String()
}

//------------------------------------------------------------------------------

func ( *DeleteQuery) ( context.Context,  ...interface{}) (sql.Result, error) {
	if .table != nil {
		if  := .beforeDeleteHook();  != nil {
			return nil, 
		}
	}

	,  := .AppendQuery(.db.fmter, .db.makeQueryBytes())
	if  != nil {
		return nil, 
	}

	 := internal.String()

	var  sql.Result

	if  := len() > 0;  || .hasReturning() {
		,  := .getModel()
		if  != nil {
			return nil, 
		}

		,  = .scan(, , , , )
		if  != nil {
			return nil, 
		}
	} else {
		,  = .exec(, , )
		if  != nil {
			return nil, 
		}
	}

	if .table != nil {
		if  := .afterDeleteHook();  != nil {
			return nil, 
		}
	}

	return , nil
}

func ( *DeleteQuery) ( context.Context) error {
	if ,  := .table.ZeroIface.(BeforeDeleteHook);  {
		if  := .BeforeDelete(, );  != nil {
			return 
		}
	}
	return nil
}

func ( *DeleteQuery) ( context.Context) error {
	if ,  := .table.ZeroIface.(AfterDeleteHook);  {
		if  := .AfterDelete(, );  != nil {
			return 
		}
	}
	return nil
}