// Copyright 2017 The Fuchsia 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 analytics_util

import (
	"sort"
	"strconv"
	"strings"
	"time"
)

type Command struct {
	name      string
	flags     map[string]string
	startTime time.Time
	endTime   time.Time
}

// string values allowed to be tracked
var allowedStrings = map[string]struct{}{
	"always": {},
	"auto":   {},
	"never":  {},
}

func newCommand(name string, flags map[string]string) *Command {
	for k, v := range flags {
		allowed := false
		if _, ok := allowedStrings[v]; ok {
			allowed = true
		} else if _, err := strconv.ParseBool(v); err == nil {
			allowed = true
		} else if _, err := strconv.ParseFloat(v, 10); err == nil {
			allowed = true
		} else if _, err := strconv.ParseInt(v, 10, 64); err == nil {
			allowed = true
		}
		if !allowed {
			flags[k] = ""
		}
	}
	c := &Command{name: name, flags: flags}
	c.startTime = time.Now()
	return c
}

func (c *Command) AnalyticsObject() AnayticsObject {
	e := Event{}
	e.Category = "Command"
	e.Action = c.name
	if !c.endTime.IsZero() {
		e.Label = "Complete"
		e.Value = c.endTime.Sub(c.startTime).Nanoseconds() / 1000000
	}
	value := ""
	if len(c.flags) > 0 {
		keys := []string{}
		for k := range c.flags {
			keys = append(keys, k)
		}
		sort.Strings(keys)
		for _, k := range keys {
			v := c.flags[k]
			value = value + k + ":" + v + ","
		}
		value = strings.TrimRight(value, ",")
	} else {
		// track no flag
		value = "()"
	}
	e.CustomDimension = make(map[string]string)
	e.CustomDimension["flags"] = value
	return e

}

func (c *Command) Done() {
	c.endTime = time.Now()
}
