package bun

import (
	
	
	
	

	
)

type mapModel struct {
	db *DB

	dest *map[string]interface{}
	m    map[string]interface{}

	rows         *sql.Rows
	columns      []string
	_columnTypes []*sql.ColumnType
	scanIndex    int
}

var _ model = (*mapModel)(nil)

func ( *DB,  *map[string]interface{}) *mapModel {
	 := &mapModel{
		db:   ,
		dest: ,
	}
	if  != nil {
		.m = *
	}
	return 
}

func ( *mapModel) () interface{} {
	return .dest
}

func ( *mapModel) ( context.Context,  *sql.Rows) (int, error) {
	if !.Next() {
		return 0, .Err()
	}

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

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

	if .m == nil {
		.m = make(map[string]interface{}, len(.columns))
	}

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

	*.dest = .m

	return 1, nil
}

func ( *mapModel) ( interface{}) error {
	if ,  := .([]byte); ! {
		return .scanRaw()
	}

	,  := .columnTypes()
	if  != nil {
		return 
	}

	 := [.scanIndex].ScanType()
	switch .Kind() {
	case reflect.Interface:
		return .scanRaw()
	case reflect.Slice:
		if .Elem().Kind() == reflect.Uint8 {
			return .scanRaw()
		}
	}

	 := reflect.New().Elem()
	if  := schema.Scanner()(, );  != nil {
		return 
	}

	return .scanRaw(.Interface())
}

func ( *mapModel) () ([]*sql.ColumnType, error) {
	if ._columnTypes == nil {
		,  := .rows.ColumnTypes()
		if  != nil {
			return nil, 
		}
		._columnTypes = 
	}
	return ._columnTypes, nil
}

func ( *mapModel) ( interface{}) error {
	 := .columns[.scanIndex]
	.scanIndex++
	.m[] = 
	return nil
}

func ( *mapModel) ( schema.Formatter,  []byte) []byte {
	 := make([]string, 0, len(.m))

	for  := range .m {
		 = append(, )
	}
	sort.Strings()

	 = append(, " ("...)

	for ,  := range  {
		if  > 0 {
			 = append(, ", "...)
		}
		 = .AppendIdent(, )
	}

	 = append(, ") VALUES ("...)

	 := .IsNop()
	for ,  := range  {
		if  > 0 {
			 = append(, ", "...)
		}
		if  {
			 = append(, '?')
		} else {
			 = .Dialect().Append(, , .m[])
		}
	}

	 = append(, ")"...)

	return 
}

func ( *mapModel) ( schema.Formatter,  []byte) []byte {
	 := make([]string, 0, len(.m))

	for  := range .m {
		 = append(, )
	}
	sort.Strings()

	 := .IsNop()
	for ,  := range  {
		if  > 0 {
			 = append(, ", "...)
		}

		 = .AppendIdent(, )
		 = append(, " = "...)
		if  {
			 = append(, '?')
		} else {
			 = .Dialect().Append(, , .m[])
		}
	}

	return 
}

func ( interface{},  int) []interface{} {
	 := make([]interface{}, )
	for  := range  {
		[] = 
	}
	return 
}