package bun

import (
	
	
	
	

	
)

type sliceTableModel struct {
	structTableModel

	slice      reflect.Value
	sliceLen   int
	sliceOfPtr bool
	nextElem   func() reflect.Value
}

var _ tableModel = (*sliceTableModel)(nil)

func (
	 *DB,  interface{},  reflect.Value,  reflect.Type,
) *sliceTableModel {
	 := &sliceTableModel{
		structTableModel: structTableModel{
			db:    ,
			table: .Table(),
			dest:  ,
			root:  ,
		},

		slice:    ,
		sliceLen: .Len(),
		nextElem: makeSliceNextElemFunc(),
	}
	.init(.Type())
	return 
}

func ( *sliceTableModel) ( reflect.Type) {
	switch .Elem().Kind() {
	case reflect.Ptr, reflect.Interface:
		.sliceOfPtr = true
	}
}

func ( *sliceTableModel) ( string) *relationJoin {
	return .join(.slice, )
}

func ( *sliceTableModel) ( reflect.Value) {
	.slice = .Field(.index[len(.index)-1])
}

func ( *sliceTableModel) ( int) {
	if  > 100 {
		 = 100
	}
	if .slice.Cap() <  {
		.slice.Set(reflect.MakeSlice(.slice.Type(), 0, ))
	}
}

func ( *sliceTableModel) ( context.Context,  *sql.Rows) (int, error) {
	,  := .Columns()
	if  != nil {
		return 0, 
	}

	.columns = 
	 := makeDest(, len())

	if .slice.IsValid() && .slice.Len() > 0 {
		.slice.Set(.slice.Slice(0, 0))
	}

	var  int

	for .Next() {
		.strct = .nextElem()
		.structInited = false

		if  := .scanRow(, , );  != nil {
			return 0, 
		}

		++
	}
	if  := .Err();  != nil {
		return 0, 
	}

	return , nil
}

// Inherit these hooks from structTableModel.
var (
	_ schema.BeforeScanHook = (*sliceTableModel)(nil)
	_ schema.AfterScanHook  = (*sliceTableModel)(nil)
)

func ( *sliceTableModel) ( time.Time) error {
	 := .slice.Len()
	for  := 0;  < ; ++ {
		 := indirect(.slice.Index())
		 := .table.SoftDeleteField.Value()
		if  := .table.UpdateSoftDeleteField(, );  != nil {
			return 
		}
	}
	return nil
}