package prometheus

import (
	"strconv"

	"github.com/crosbymichael/cgroups"
	metrics "github.com/docker/go-metrics"
	"github.com/prometheus/client_golang/prometheus"
)

var cpuMetrics = []*metric{
	{
		name: "cpu_total",
		help: "The total cpu time",
		unit: metrics.Nanoseconds,
		vt:   prometheus.GaugeValue,
		getValues: func(stats *cgroups.Stats) []value {
			if stats.Cpu == nil {
				return nil
			}
			return []value{
				{
					v: float64(stats.Cpu.Usage.Total),
				},
			}
		},
	},
	{
		name: "cpu_kernel",
		help: "The total kernel cpu time",
		unit: metrics.Nanoseconds,
		vt:   prometheus.GaugeValue,
		getValues: func(stats *cgroups.Stats) []value {
			if stats.Cpu == nil {
				return nil
			}
			return []value{
				{
					v: float64(stats.Cpu.Usage.Kernel),
				},
			}
		},
	},
	{
		name: "cpu_user",
		help: "The total user cpu time",
		unit: metrics.Nanoseconds,
		vt:   prometheus.GaugeValue,
		getValues: func(stats *cgroups.Stats) []value {
			if stats.Cpu == nil {
				return nil
			}
			return []value{
				{
					v: float64(stats.Cpu.Usage.User),
				},
			}
		},
	},
	{
		name:   "per_cpu",
		help:   "The total cpu time per cpu",
		unit:   metrics.Nanoseconds,
		vt:     prometheus.GaugeValue,
		labels: []string{"cpu"},
		getValues: func(stats *cgroups.Stats) []value {
			if stats.Cpu == nil {
				return nil
			}
			var out []value
			for i, v := range stats.Cpu.Usage.PerCpu {
				out = append(out, value{
					v: float64(v),
					l: []string{strconv.Itoa(i)},
				})
			}
			return out
		},
	},
	{
		name: "cpu_throttle_periods",
		help: "The total cpu throttle periods",
		unit: metrics.Total,
		vt:   prometheus.GaugeValue,
		getValues: func(stats *cgroups.Stats) []value {
			if stats.Cpu == nil {
				return nil
			}
			return []value{
				{
					v: float64(stats.Cpu.Throttling.Periods),
				},
			}
		},
	},
	{
		name: "cpu_throttled_periods",
		help: "The total cpu throttled periods",
		unit: metrics.Total,
		vt:   prometheus.GaugeValue,
		getValues: func(stats *cgroups.Stats) []value {
			if stats.Cpu == nil {
				return nil
			}
			return []value{
				{
					v: float64(stats.Cpu.Throttling.ThrottledPeriods),
				},
			}
		},
	},
	{
		name: "cpu_throttled_time",
		help: "The total cpu throttled time",
		unit: metrics.Nanoseconds,
		vt:   prometheus.GaugeValue,
		getValues: func(stats *cgroups.Stats) []value {
			if stats.Cpu == nil {
				return nil
			}
			return []value{
				{
					v: float64(stats.Cpu.Throttling.ThrottledTime),
				},
			}
		},
	},
}
