package influxdb

import (
	"fmt"

	"code.google.com/p/log4go"
)

// TimePrecision represents a level of time precision.
type TimePrecision int

const (
	// MicrosecondPrecision is 1/1,000,000 th of a second.
	MicrosecondPrecision TimePrecision = iota
	// MillisecondPrecision is 1/1,000 th of a second.
	MillisecondPrecision
	// SecondPrecision is 1 second precision.
	SecondPrecision
)

func parseTimePrecision(s string) (TimePrecision, error) {
	switch s {
	case "u":
		return MicrosecondPrecision, nil
	case "m":
		log4go.Warn("time_precision=m will be disabled in future release, use time_precision=ms instead")
		fallthrough
	case "ms":
		return MillisecondPrecision, nil
	case "s":
		return SecondPrecision, nil
	case "":
		return MillisecondPrecision, nil
	}

	return 0, fmt.Errorf("Unknown time precision %s", s)
}

func hasDuplicates(ss []string) bool {
	m := make(map[string]struct{}, len(ss))
	for _, s := range ss {
		if _, ok := m[s]; ok {
			return true
		}
		m[s] = struct{}{}
	}
	return false
}

func removeField(fields []string, name string) []string {
	index := -1
	for idx, field := range fields {
		if field == name {
			index = idx
			break
		}
	}

	if index == -1 {
		return fields
	}

	return append(fields[:index], fields[index+1:]...)
}

func removeTimestampFieldDefinition(fields []string) []string {
	fields = removeField(fields, "time")
	return removeField(fields, "sequence_number")
}

func mapKeyList(m interface{}) []string {

	switch m.(type) {
	case map[string]string:
		return mapStrStrKeyList(m.(map[string]string))
	case map[string]uint32:
		return mapStrUint32KeyList(m.(map[string]uint32))
	}
	return nil
}

func mapStrStrKeyList(m map[string]string) []string {
	l := make([]string, 0, len(m))
	for k := range m {
		l = append(l, k)
	}
	return l
}

func mapStrUint32KeyList(m map[string]uint32) []string {
	l := make([]string, 0, len(m))
	for k := range m {
		l = append(l, k)
	}
	return l
}