package envs

/*
	EnvMapper contains the environment variables as grouped by their basic type.
	If a variable's type cannot be determined, it's placed in Strings.
	If a variable's type is a list, it will be an []interface{} as each item may be a different variable type.
	It essentially is the same as EnvMap except with the types split out for convenience.
*/
type EnvMapper struct {
	Booleans map[string]bool          `json:"bools"`
	Numbers  map[string]int           `json:"nums"`
	Strings  map[string]string        `json:"strings"`
	Lists    map[string][]interface{} `json:"lists"`
}

// GetEnvMapper returns a pointer to a populated EnvMapper.
func GetEnvMapper() (e *EnvMapper, err error) {

	var em map[string]interface{}
	var env EnvMapper

	env = EnvMapper{
		Booleans: nil,
		Numbers:  nil,
		Strings:  nil,
		Lists:    nil,
	}

	for k, v := range em {

		switch t := v.(type) {
		case bool:
			if env.Booleans == nil {
				env.Booleans = make(map[string]bool, 0)
			}
			env.Booleans[k] = t
			continue
		case int:
			if env.Numbers == nil {
				env.Numbers = make(map[string]int, 0)
			}
			env.Numbers[k] = t
			continue
		case []interface{}:
			if env.Lists == nil {
				env.Lists = make(map[string][]interface{}, 0)
			}
			env.Lists[k] = t
		case string: // the "default" since everything could probably be typeswitched to a string otherwise.
			if env.Strings == nil {
				env.Strings = make(map[string]string, 0)
			}
			env.Strings[k] = t
		}
	}

	*e = env

	return
}