package datadog

import (
	"github.com/go-kratos/kratos/v2/metrics"
)

var _ metrics.Counter = (*counter)(nil)

type counter struct {
	opts options
	name string
	lvs  []string
}

// NewCounter new a DataDog counter and returns Counter.
func NewCounter(name string, opts ...Option) metrics.Counter {
	counterOpts := options{
		sampleRate: 1,
		client:     defaultClient,
	}
	for _, o := range opts {
		o(&counterOpts)
	}
	return &counter{
		name: name,
		opts: counterOpts,
	}
}

// With is applied in kratos/middleware/metrics/metrics.go (method,path,code)
func (d *counter) With(values ...string) metrics.Counter {
	return &counter{
		name: d.name,
		opts: d.opts,
		lvs:  withValues(d.opts.labels, values),
	}
}

func (d *counter) Inc() {
	_ = d.opts.client.Incr(d.name, d.lvs, d.opts.sampleRate)
}

func (d *counter) Add(delta float64) {
	_ = d.opts.client.Count(d.name, int64(delta), d.lvs, d.opts.sampleRate)
}