package schema

import (
	
	
	
	
	

	
	
)

var embeddedCacheKey = "embedded_cache_store"

func ( string,  string) map[string]string {
	 := map[string]string{}
	 := strings.Split(, )

	for  := 0;  < len(); ++ {
		 := 
		if len([]) > 0 {
			for {
				if [][len([])-1] == '\\' {
					++
					[] = [][0:len([])-1] +  + []
					[] = ""
				} else {
					break
				}
			}
		}

		 := strings.Split([], ":")
		 := strings.TrimSpace(strings.ToUpper([0]))

		if len() >= 2 {
			[] = strings.Join([1:], ":")
		} else if  != "" {
			[] = 
		}
	}

	return 
}

func toColumns( string) ( []string) {
	if  != "" {
		for ,  := range strings.Split(, ",") {
			 = append(, strings.TrimSpace())
		}
	}
	return
}

func removeSettingFromTag( reflect.StructTag,  ...string) reflect.StructTag {
	for ,  := range  {
		 = reflect.StructTag(regexp.MustCompile(`(?i)(gorm:.*?)(`++`(:.*?)?)(;|("))`).ReplaceAllString(string(), "${1}${5}"))
	}
	return 
}

func appendSettingFromTag( reflect.StructTag,  string) reflect.StructTag {
	 := .Get("gorm")
	if strings.Contains(, ) {
		return 
	}
	return reflect.StructTag(fmt.Sprintf(`gorm:"%s;%s"`, , ))
}

// GetRelationsValues get relations's values from a reflect value
func ( context.Context,  reflect.Value,  []*Relationship) ( reflect.Value) {
	for ,  := range  {
		 = reflect.MakeSlice(reflect.SliceOf(reflect.PtrTo(.FieldSchema.ModelType)), 0, 1)

		 := func( reflect.Value) {
			if ,  := .Field.ValueOf(, ); ! {
				 := reflect.Indirect(.Field.ReflectValueOf(, ))
				switch .Kind() {
				case reflect.Struct:
					 = reflect.Append(, .Addr())
				case reflect.Slice, reflect.Array:
					for  := 0;  < .Len(); ++ {
						if  := .Index(); .Kind() == reflect.Ptr {
							 = reflect.Append(, )
						} else {
							 = reflect.Append(, .Addr())
						}
					}
				}
			}
		}

		switch .Kind() {
		case reflect.Struct:
			()
		case reflect.Slice:
			for  := 0;  < .Len(); ++ {
				(.Index())
			}
		}

		 = 
	}

	return
}

// GetIdentityFieldValuesMap get identity map from fields
func ( context.Context,  reflect.Value,  []*Field) (map[string][]reflect.Value, [][]interface{}) {
	var (
		       = [][]interface{}{}
		   = map[string][]reflect.Value{}
		        = map[interface{}]bool{}
		,  bool
	)

	if .Kind() == reflect.Ptr ||
		.Kind() == reflect.Interface {
		 = .Elem()
	}

	switch .Kind() {
	case reflect.Struct:
		 = [][]interface{}{make([]interface{}, len())}

		for ,  := range  {
			[0][],  = .ValueOf(, )
			 =  || !
		}

		if ! {
			return nil, nil
		}

		[utils.ToStringKey([0]...)] = []reflect.Value{}
	case reflect.Slice, reflect.Array:
		for  := 0;  < .Len(); ++ {
			 := .Index()
			 := .Interface()
			if .Kind() != reflect.Ptr && .CanAddr() {
				 = .Addr().Interface()
			}

			if ,  := [];  {
				continue
			}
			[] = true

			 := make([]interface{}, len())
			 = false
			for ,  := range  {
				[],  = .ValueOf(, )
				 =  || !
			}

			if  {
				 := utils.ToStringKey(...)
				if ,  := []; ! {
					 = append(, )
					[] = []reflect.Value{}
				} else {
					[] = append([], )
				}
			}
		}
	}

	return , 
}

// GetIdentityFieldValuesMapFromValues get identity map from fields
func ( context.Context,  []interface{},  []*Field) (map[string][]reflect.Value, [][]interface{}) {
	 := map[string][]reflect.Value{}
	 := [][]interface{}{}

	for ,  := range  {
		,  := GetIdentityFieldValuesMap(, reflect.Indirect(reflect.ValueOf()), )
		for ,  := range  {
			[] = append([], ...)
		}
		 = append(, ...)
	}
	return , 
}

// ToQueryValues to query values
func ( string,  []string,  [][]interface{}) (interface{}, []interface{}) {
	 := make([]interface{}, len())
	if len() == 1 {
		for ,  := range  {
			[] = [0]
		}

		return clause.Column{Table: , Name: [0]}, 
	}

	 := make([]clause.Column, len())
	for ,  := range  {
		[] = clause.Column{Table: , Name: }
	}

	for ,  := range  {
		[] = 
	}

	return , 
}

type embeddedNamer struct {
	Table string
	Namer
}