package client

import (
	"time"

	"github.com/prometheus/client_golang/prometheus"
	"github.com/tidbcloud/observability/pkg/common/constants"
	apierrors "k8s.io/apimachinery/pkg/api/errors"
	ctrlmetrics "sigs.k8s.io/controller-runtime/pkg/metrics"
)

var (
	// mysqlClientOperationDuration tracks the duration of MySQL client operations
	mysqlClientOperationDuration *prometheus.HistogramVec
)

func init() {
	mysqlClientOperationDuration = prometheus.NewHistogramVec(
		prometheus.HistogramOpts{
			Namespace: constants.ObservabilityBaseServiceName,
			Subsystem: "mysql_client",
			Name:      "operation_duration_seconds",
			Help:      "Duration of MySQL client operations in seconds",
			Buckets:   []float64{0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0, 10.0, 20.0},
		},
		[]string{"operation", "status"},
	)
	ctrlmetrics.Registry.MustRegister(mysqlClientOperationDuration)
}

// recordOperationDuration records the duration of an operation
func recordOperationDuration(operation string, start time.Time, err error) {
	duration := time.Since(start).Seconds()
	status := "success"
	if apierrors.IsNotFound(err) {
		status = "notfound"
	} else if apierrors.IsAlreadyExists(err) {
		status = "alreadyexists"
	} else if err != nil {
		status = "error"
	}
	mysqlClientOperationDuration.WithLabelValues(operation, status).Observe(duration)
}
