package metric

import (
	"fmt"
	"time"

	"github.com/prometheus/client_golang/prometheus"
	"github.com/tidbcloud/dataflow-service/app/repo/entity"
)

const (
	NS                   = "dataflow"
	SUBSYSTEM_COMPACT    = "compact_backup"
	ClusterIDLabel       = "cluster_id"
	CompactBackupIDLabel = "compact_backup_id"
	LogBackupIDLabel     = "log_backup_id"
	BucketIDLabel        = "bucket_id"

	WaitMetricScrapeInterval = time.Minute * 2
)

var commonLabels = []string{ClusterIDLabel, CompactBackupIDLabel, LogBackupIDLabel, BucketIDLabel}

var (
	//nolint:gomnd
	CompactBackupStatusIntMap = map[entity.CompactBackupStatus]int{
		entity.CompactBackupStatusPending:  1,
		entity.CompactBackupStatusRunning:  2,
		entity.CompactBackupStatusSuccess:  3,
		entity.CompactBackupStatusFailed:   4,
		entity.CompactBackupStatusDeleting: 5,
		entity.CompactBackupStatusDeleted:  6,
	}

	CompactBackupStatusDesc = prometheus.NewDesc(
		prometheus.BuildFQName(NS, SUBSYSTEM_COMPACT, "status_desc"),
		"the status of compact backup jobs",
		commonLabels, nil)

	CompactBackupStatus = prometheus.NewGaugeVec(
		prometheus.GaugeOpts{
			Namespace: NS,
			Subsystem: SUBSYSTEM_COMPACT,
			Name:      "status",
			Help:      "compact backup status: 1-pending, 2-running, 3-success, 4-failed, 5-deleting, 6-deleted",
		}, commonLabels)
)

func UpdateCompactBackupStatusMetric(cb *entity.CompactBackup) {
	CompactBackupStatus.WithLabelValues(
		fmt.Sprintf("%d", cb.ClusterID),
		fmt.Sprintf("%d", cb.ID),
		fmt.Sprintf("%d", cb.LogBackupID),
		fmt.Sprintf("%d", cb.BucketID),
	).Set(float64(CompactBackupStatusIntMap[cb.Status]))
}

func DeleteCompactBackupStatusMetric(cb *entity.CompactBackup) {
	CompactBackupStatus.DeletePartialMatch(prometheus.Labels{
		CompactBackupIDLabel: fmt.Sprintf("%d", cb.ID),
	})
}
