// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Package envvar implements utilities for processing environment variables.
// There are three representations of environment variables:
//   1) []"key=value"  # hard to get and set, used by standard Go packages
//   2) map[key]value  # simple to get and set, nicest syntax
//   3) *envvar.Vars   # simple to get and set, also tracks deltas
//
// The slice form (1) is used by standard Go packages, presumably since it's
// similar to the underlying OS representation.  The map form (2) is convenient
// to use, and has native Go map syntax.  The Vars form (3) is also convenient
// to use, and tracks deltas when mutations are performed.
//
// This package provides utilities to easily use and convert between the three
// representations.
//
// Empty keys are invalid and silently skipped in operations over all
// representations.
package envvar

import (
	"os"
	"sort"
	"strings"
)

// MergeMaps merges together maps, and returns a new map with the merged result.
// If the same key appears in more than one input map, the last one "wins"; the
// value is set based on the last map containing that key.
//
// As a result of its semantics, MergeMaps called with a single map returns a
// copy of the map, with empty keys dropped.
func MergeMaps(maps ...map[string]string) map[string]string {
	merged := make(map[string]string)
	for _, m := range maps {
		for key, value := range m {
			if key != "" {
				merged[key] = value
			}
		}
	}
	return merged
}

// MergeSlices merges together slices, and returns a new slice with the merged
// result.  If the same key appears more than once in a single input slice, or
// in more than one input slice, the last one "wins"; the value is set based on
// the last slice element in the last slice containing that key.
//
// As a result of its semantics, MergeSlices called with a single slice returns
// a copy of the slice, with empty keys dropped.
func MergeSlices(slices ...[]string) []string {
	merged := make(map[string]string)
	for _, slice := range slices {
		for _, kv := range slice {
			if key, value := SplitKeyValue(kv); key != "" {
				merged[key] = value
			}
		}
	}
	return MapToSlice(merged)
}

// MapToSlice converts from the map to the slice representation.  The returned
// slice is in sorted order.
func MapToSlice(from map[string]string) []string {
	to := make([]string, 0, len(from))
	for key, value := range from {
		if key != "" {
			to = append(to, JoinKeyValue(key, value))
		}
	}
	SortByKey(to)
	return to
}

// SliceToMap converts from the slice to the map representation.  If the same
// key appears more than once, the last one "wins"; the value is set based on
// the last slice element containing that key.
func SliceToMap(from []string) map[string]string {
	to := make(map[string]string, len(from))
	for _, kv := range from {
		if key, value := SplitKeyValue(kv); key != "" {
			to[key] = value
		}
	}
	return to
}

// SplitKeyValue splits kv into its key and value components.  The format of kv
// is "key=value"; the split is performed on the first '=' character.
func SplitKeyValue(kv string) (string, string) {
	split := strings.SplitN(kv, "=", 2)
	if len(split) == 2 {
		return split[0], split[1]
	}
	return split[0], ""
}

// JoinKeyValue joins key and value into a single string "key=value".
func JoinKeyValue(key, value string) string {
	return key + "=" + value
}

// SplitTokens is like strings.Split(value, separator), but also filters out
// empty tokens.  Thus SplitTokens("", ":") returns a nil slice, unlike
// strings.SplitTokens which returns a slice with a single empty string.
func SplitTokens(value, separator string) []string {
	var tokens []string
	for _, token := range strings.Split(value, separator) {
		if token != "" {
			tokens = append(tokens, token)
		}
	}
	return tokens
}

// JoinTokens is like strings.Join(tokens, separator), but also filters out
// empty tokens.
func JoinTokens(tokens []string, separator string) string {
	var value string
	for _, token := range tokens {
		if token == "" {
			continue
		}
		if value != "" {
			value += separator
		}
		value += token
	}
	return value
}

// SortByKey sorts vars into ascending key order, where vars is expected to be
// in the []"key=value" slice representation.
func SortByKey(vars []string) {
	sort.Sort(keySorter(vars))
}

type keySorter []string

func (s keySorter) Len() int      { return len(s) }
func (s keySorter) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
func (s keySorter) Less(i, j int) bool {
	ikey, _ := SplitKeyValue(s[i])
	jkey, _ := SplitKeyValue(s[j])
	return ikey < jkey
}

// Vars is a mutable set of environment variables that tracks deltas.
//
// Vars are initialized with a base environment, and may be mutated with calls
// to Set and SetTokens.  The resulting environment is retrieved with calls to
// ToMap and ToSlice.
//
// Mutations are tracked separately from the base environment; call Deltas to
// retrieve only the environment variables that have been changed.
//
// The zero Vars has an empty environment, and supports all methods.
type Vars struct {
	base        map[string]string
	deltaInsert map[string]string
	deltaRemove map[string]bool
}

// VarsFromMap returns a new Vars initialized from the given base map.
func VarsFromMap(base map[string]string) *Vars { return &Vars{base: MergeMaps(base)} }

// VarsFromSlice returns a new Vars initialized from the given base slice.
func VarsFromSlice(base []string) *Vars { return &Vars{base: SliceToMap(base)} }

// VarsFromOS returns a new Vars initialized from os.Environ.
func VarsFromOS() *Vars { return VarsFromSlice(os.Environ()) }

// Contains returns true iff the key exists in the current set of variables.
func (x *Vars) Contains(key string) bool {
	if x.deltaRemove[key] {
		return false
	}
	if _, ok := x.deltaInsert[key]; ok {
		return true
	}
	_, ok := x.base[key]
	return ok
}

// Get returns the value associated with key.  Returns "" if the key doesn't
// exist, or if the key has an empty value.  Use Contains to test for existence.
func (x *Vars) Get(key string) string {
	if x.deltaRemove[key] {
		return ""
	}
	if value, ok := x.deltaInsert[key]; ok {
		return value
	}
	return x.base[key]
}

// GetTokens is a convenience that calls SplitTokens(x.Get(key), separator).
func (x *Vars) GetTokens(key, separator string) []string {
	return SplitTokens(x.Get(key), separator)
}

// Set assigns key to the given value.
func (x *Vars) Set(key, value string) {
	if key != "" {
		if x.deltaInsert == nil {
			x.deltaInsert = make(map[string]string)
		}
		x.deltaInsert[key] = value
		delete(x.deltaRemove, key)
	}
}

// SetTokens is a convenience that calls x.Set(key, JoinTokens(tokens, separator)).
func (x *Vars) SetTokens(key string, tokens []string, separator string) {
	x.Set(key, JoinTokens(tokens, separator))
}

// Delete removes the given keys.  Subsequent calls to Contains on each key
// will return false.
func (x *Vars) Delete(keys ...string) {
	for _, key := range keys {
		if key != "" {
			if x.deltaRemove == nil {
				x.deltaRemove = make(map[string]bool)
			}
			x.deltaRemove[key] = true
			delete(x.deltaInsert, key)
		}
	}
}

// ToMap returns the map representation of the current set of variables.
//
// Mutating the returned map does not affect x.
func (x *Vars) ToMap() map[string]string {
	snapshot := MergeMaps(x.base, x.deltaInsert)
	for key, _ := range x.deltaRemove {
		delete(snapshot, key)
	}
	return snapshot
}

// ToSlice returns the slice representation of the current set of variables.
//
// Mutating the returned slice does not affect x.
func (x *Vars) ToSlice() []string {
	return MapToSlice(x.ToMap())
}

// Base returns a copy of the original base environment.
//
// Mutating the returned map does not affect x.
func (x *Vars) Base() map[string]string {
	return MergeMaps(x.base)
}

// Deltas returns the set of variables that have been mutated after
// initialization.
//
// If the last mutation for key K was Set or SetTokens, map[K] contains a
// non-nil pointer to the last value that was set.  If the last mutation for key
// K was Delete, map[K] contains a nil pointer.
//
// Mutating the returned map does not affect x.
func (x *Vars) Deltas() map[string]*string {
	deltas := make(map[string]*string, len(x.deltaInsert)+len(x.deltaRemove))
	for key, value := range x.deltaInsert {
		cp := value
		deltas[key] = &cp
	}
	for key, _ := range x.deltaRemove {
		deltas[key] = nil
	}
	return deltas
}

// UpdateOS updates the OS with the current set of variables.  All variables are
// visited in sorted order, and os.Setenv is called for each variable.
//
// Returns the first error encountered, if any.
func (x *Vars) UpdateOS() error {
	var firstErr error
	for _, kv := range x.ToSlice() {
		key, value := SplitKeyValue(kv)
		if err := os.Setenv(key, value); err != nil && firstErr == nil {
			firstErr = err
		}
	}
	return firstErr
}
