package metric

import (
	"fmt"
	"time"

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

const (
	NS               = "dataflow"
	SUBSYSTEM_BACKUP = "backup"

	ClusterIDLabel = "cluster_id"
	BackupIDLabel  = "backup_id"

	WaitMetricScrapeInterval = time.Minute * 2
)

var commonLabels = []string{ClusterIDLabel, BackupIDLabel}

var (
	//nolint:gomnd
	BackupStatusIntMap = map[entity.BackupStatus]int{
		entity.BackupStatusUnspecified: 0,
		entity.BackupStatusPending:     1,
		entity.BackupStatusRunning:     2,
		entity.BackupStatusFailed:      3,
		entity.BackupStatusSuccess:     4,
		entity.BackupStatusSkipped:     5,
		entity.BackupStatusTerminated:  6,
	}

	BackupStatusDesc = prometheus.NewDesc(
		prometheus.BuildFQName(NS, SUBSYSTEM_BACKUP, "status_desc"),
		"the status of backup jobs",
		commonLabels, nil)

	BackupStatus = prometheus.NewGaugeVec(
		prometheus.GaugeOpts{
			Namespace:   NS,
			Subsystem:   SUBSYSTEM_BACKUP,
			Name:        "status",
			Help:        "backup status: 1 - pending, 2 - running, 3 - failed, 4 - success, 5 - skipped, 6 - terminated",
			ConstLabels: nil,
		}, commonLabels)
)

func UpdateBackupStatusMetric(br *entity.Backup) {
	BackupStatus.WithLabelValues(
		fmt.Sprintf("%d", br.ClusterID),
		fmt.Sprintf("%d", br.ID)).Set(float64(BackupStatusIntMap[br.Status]))
}

func DeleteBackupStatusMetric(br *entity.Backup) {
	BackupStatus.DeletePartialMatch(prometheus.Labels{
		BackupIDLabel: fmt.Sprintf("%d", br.ID),
	})
}
