package orm

import (
	
	

	
)

type sliceTableModel struct {
	structTableModel

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

var _ TableModel = (*sliceTableModel)(nil)

func ( reflect.Value,  reflect.Type) *sliceTableModel {
	 := &sliceTableModel{
		structTableModel: structTableModel{
			table: GetTable(),
			root:  ,
		},
		slice:    ,
		sliceLen: .Len(),
		nextElem: internal.MakeSliceNextElemFunc(),
	}
	.init(.Type())
	return 
}

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

//nolint
func (*sliceTableModel) () {}

func ( *sliceTableModel) () bool {
	return false
}

func ( *sliceTableModel) ( QueryFormatter,  []byte,  string) ([]byte, bool) {
	if ,  := .table.FieldsMap[];  {
		 = append(, "_data."...)
		 = append(, .Column...)
		return , true
	}
	return .structTableModel.AppendParam(, , )
}

func ( *sliceTableModel) ( string,  func(*Query) (*Query, error)) *join {
	return .join(.Value(), , )
}

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

func ( *sliceTableModel) () reflect.Kind {
	return reflect.Slice
}

func ( *sliceTableModel) () reflect.Value {
	return .slice
}

func ( *sliceTableModel) () error {
	if .slice.IsValid() && .slice.Len() > 0 {
		.slice.Set(.slice.Slice(0, 0))
	}
	return nil
}

func ( *sliceTableModel) () ColumnScanner {
	.strct = .nextElem()
	.structInited = false
	return 
}

func ( *sliceTableModel) ( ColumnScanner) error {
	return nil
}

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

func ( *sliceTableModel) ( context.Context) error {
	if .table.hasFlag(afterSelectHookFlag) {
		return callAfterSelectHookSlice(, .slice, .sliceOfPtr)
	}
	return nil
}

func ( *sliceTableModel) ( context.Context) (context.Context, error) {
	if .table.hasFlag(beforeInsertHookFlag) {
		return callBeforeInsertHookSlice(, .slice, .sliceOfPtr)
	}
	return , nil
}

func ( *sliceTableModel) ( context.Context) error {
	if .table.hasFlag(afterInsertHookFlag) {
		return callAfterInsertHookSlice(, .slice, .sliceOfPtr)
	}
	return nil
}

func ( *sliceTableModel) ( context.Context) (context.Context, error) {
	if .table.hasFlag(beforeUpdateHookFlag) && !.IsNil() {
		return callBeforeUpdateHookSlice(, .slice, .sliceOfPtr)
	}
	return , nil
}

func ( *sliceTableModel) ( context.Context) error {
	if .table.hasFlag(afterUpdateHookFlag) {
		return callAfterUpdateHookSlice(, .slice, .sliceOfPtr)
	}
	return nil
}

func ( *sliceTableModel) ( context.Context) (context.Context, error) {
	if .table.hasFlag(beforeDeleteHookFlag) && !.IsNil() {
		return callBeforeDeleteHookSlice(, .slice, .sliceOfPtr)
	}
	return , nil
}

func ( *sliceTableModel) ( context.Context) error {
	if .table.hasFlag(afterDeleteHookFlag) && !.IsNil() {
		return callAfterDeleteHookSlice(, .slice, .sliceOfPtr)
	}
	return nil
}

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