package segment

import (
	"time"

	"github.com/segmentio/analytics-go"
	metric "github.com/usememos/memos/plugin/metrics"
)

// collector is the metrics collector https://segment.com/.
type collector struct {
	client analytics.Client
}

// NewCollector creates a new instance of segment.
func NewCollector(key string) metric.Collector {
	client := analytics.New(key)

	return &collector{
		client: client,
	}
}

// Identify will identify the server caller.
func (c *collector) Identify(id string) error {
	return c.client.Enqueue(analytics.Identify{
		UserId:    id,
		Timestamp: time.Now().UTC(),
	})
}

// Collect will exec all the segment collector.
func (c *collector) Collect(metric *metric.Metric) error {
	properties := analytics.NewProperties()
	for key, value := range metric.Labels {
		properties.Set(key, value)
	}

	return c.client.Enqueue(analytics.Track{
		UserId:     metric.ID,
		Timestamp:  time.Now().UTC(),
		Event:      metric.Name,
		Properties: properties,
	})
}