package gorm

import (
	
	
	
	

	
	
	
)

type DeletedAt sql.NullTime

// Scan implements the Scanner interface.
func ( *DeletedAt) ( interface{}) error {
	return (*sql.NullTime)().Scan()
}

// Value implements the driver Valuer interface.
func ( DeletedAt) () (driver.Value, error) {
	if !.Valid {
		return nil, nil
	}
	return .Time, nil
}

func ( DeletedAt) () ([]byte, error) {
	if .Valid {
		return json.Marshal(.Time)
	}
	return json.Marshal(nil)
}

func ( *DeletedAt) ( []byte) error {
	if string() == "null" {
		.Valid = false
		return nil
	}
	 := json.Unmarshal(, &.Time)
	if  == nil {
		.Valid = true
	}
	return 
}

func (DeletedAt) ( *schema.Field) []clause.Interface {
	return []clause.Interface{SoftDeleteQueryClause{Field: , ZeroValue: parseZeroValueTag()}}
}

func parseZeroValueTag( *schema.Field) sql.NullString {
	if ,  := .TagSettings["ZEROVALUE"];  {
		if ,  := now.Parse();  == nil {
			return sql.NullString{String: , Valid: true}
		}
	}
	return sql.NullString{Valid: false}
}

type SoftDeleteQueryClause struct {
	ZeroValue sql.NullString
	Field     *schema.Field
}

func ( SoftDeleteQueryClause) () string {
	return ""
}

func ( SoftDeleteQueryClause) (clause.Builder) {
}

func ( SoftDeleteQueryClause) (*clause.Clause) {
}

func ( SoftDeleteQueryClause) ( *Statement) {
	if ,  := .Clauses["soft_delete_enabled"]; ! && !.Statement.Unscoped {
		if ,  := .Clauses["WHERE"];  {
			if ,  := .Expression.(clause.Where);  && len(.Exprs) >= 1 {
				for ,  := range .Exprs {
					if ,  := .(clause.OrConditions);  && len(.Exprs) == 1 {
						.Exprs = []clause.Expression{clause.And(.Exprs...)}
						.Expression = 
						.Clauses["WHERE"] = 
						break
					}
				}
			}
		}

		.AddClause(clause.Where{Exprs: []clause.Expression{
			clause.Eq{Column: clause.Column{Table: clause.CurrentTable, Name: .Field.DBName}, Value: .ZeroValue},
		}})
		.Clauses["soft_delete_enabled"] = clause.Clause{}
	}
}

func (DeletedAt) ( *schema.Field) []clause.Interface {
	return []clause.Interface{SoftDeleteUpdateClause{Field: , ZeroValue: parseZeroValueTag()}}
}

type SoftDeleteUpdateClause struct {
	ZeroValue sql.NullString
	Field     *schema.Field
}

func ( SoftDeleteUpdateClause) () string {
	return ""
}

func ( SoftDeleteUpdateClause) (clause.Builder) {
}

func ( SoftDeleteUpdateClause) (*clause.Clause) {
}

func ( SoftDeleteUpdateClause) ( *Statement) {
	if .SQL.Len() == 0 && !.Statement.Unscoped {
		SoftDeleteQueryClause().ModifyStatement()
	}
}

func (DeletedAt) ( *schema.Field) []clause.Interface {
	return []clause.Interface{SoftDeleteDeleteClause{Field: , ZeroValue: parseZeroValueTag()}}
}

type SoftDeleteDeleteClause struct {
	ZeroValue sql.NullString
	Field     *schema.Field
}

func ( SoftDeleteDeleteClause) () string {
	return ""
}

func ( SoftDeleteDeleteClause) (clause.Builder) {
}

func ( SoftDeleteDeleteClause) (*clause.Clause) {
}

func ( SoftDeleteDeleteClause) ( *Statement) {
	if .SQL.Len() == 0 && !.Statement.Unscoped {
		 := .DB.NowFunc()
		.AddClause(clause.Set{{Column: clause.Column{Name: .Field.DBName}, Value: }})
		.SetColumn(.Field.DBName, , true)

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

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

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

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

		SoftDeleteQueryClause().ModifyStatement()
		.AddClauseIfNotExists(clause.Update{})
		.Build(.DB.Callback().Update().Clauses...)
	}
}