package model

import "context"

// MetricValue is a prometheus-style labeled numerical metric value. In other
// words, it's a number accompanied by string key/value pairs.
type MetricValue struct {
	Count  int64
	Labels map[string]string
}

// WrapSimpleMetric turns a SQL model function which returns a single number into
// a function which returns one-length MetricValue list with no labels.
func WrapSimpleMetric(fn func(*Queries, context.Context) (int64, error)) func(*Queries, context.Context) ([]MetricValue, error) {
	return func(q *Queries, ctx context.Context) ([]MetricValue, error) {
		v, err := fn(q, ctx)
		if err != nil {
			return nil, err
		}
		return []MetricValue{
			{
				Count:  v,
				Labels: nil,
			},
		}, nil
	}
}

// A SQLMetricRow is a row that is the result of some kind of SQL 'metric query'.
// For each such query we define in our *.sql files, a corresponding
// implementation exists here.
type SQLMetricRow interface {
	Value() MetricValue
}

// Value implements SQLMetricRow for a row of the result of the
// CountActiveBackoffs SQL metric query.
func (c CountActiveBackoffsRow) Value() MetricValue {
	return MetricValue{
		Count: c.Count,
		Labels: map[string]string{
			"process": string(c.Process),
		},
	}
}

// Value implements SQLMetricRow for a row of the result of the
// CountActiveWork SQL metric query.
func (c CountActiveWorkRow) Value() MetricValue {
	return MetricValue{
		Count: c.Count,
		Labels: map[string]string{
			"process": string(c.Process),
		},
	}
}

// WrapLabeledMetric turns a SQL model function which returns a list of rows
// implementing SQLMetricRow into a function which returns a list of MetricValues
// with labels corresponding to the data returned in the rows.
func WrapLabeledMetric[M SQLMetricRow](fn func(*Queries, context.Context) ([]M, error)) func(*Queries, context.Context) ([]MetricValue, error) {
	return func(q *Queries, ctx context.Context) ([]MetricValue, error) {
		v, err := fn(q, ctx)
		if err != nil {
			return nil, err
		}
		res := make([]MetricValue, len(v))
		for i, vv := range v {
			res[i] = vv.Value()
		}
		return res, nil
	}
}
