package bgtask

import (
	"github.com/prometheus/client_golang/prometheus"
	"github.com/tidbcloud/aws-shared-provider/pkg/tidbworker/job"
	"github.com/tidbcloud/aws-shared-provider/pkg/tidbworker/metrics"
	"github.com/tidbcloud/aws-shared-provider/pkg/tidbworker/schema/bgtask"
)

var (
	runnerCounter        map[job.Type]prometheus.Counter
	currentTaskCounter   map[job.Type]map[bgtask.State]prometheus.Gauge
	taskCompleteDuration map[job.Type]prometheus.Observer
	taskQueueDuration    map[job.Type]prometheus.Observer
)

//nolint:lll // ignore long line length
func initMetrics() {
	runnerCounter = map[job.Type]prometheus.Counter{
		job.TypeBatch:      metrics.RunnerCounter.WithLabelValues(string(job.TypeBatch)),
		job.TypeDDL:        metrics.RunnerCounter.WithLabelValues(string(job.TypeDDL)),
		job.TypeImportInto: metrics.RunnerCounter.WithLabelValues(string(job.TypeImportInto)),
		job.TypeShared:     metrics.RunnerCounter.WithLabelValues(string(job.TypeShared)),
	}
	currentTaskCounter = map[job.Type]map[bgtask.State]prometheus.Gauge{
		job.TypeBatch: {
			bgtask.StatePending: metrics.CurrentTaskCounter.WithLabelValues(string(job.TypeBatch), string(bgtask.StatePending)),
			bgtask.StateRunning: metrics.CurrentTaskCounter.WithLabelValues(string(job.TypeBatch), string(bgtask.StateRunning)),
			bgtask.StateDone:    metrics.CurrentTaskCounter.WithLabelValues(string(job.TypeBatch), string(bgtask.StateDone)),
			bgtask.StatePaused:  metrics.CurrentTaskCounter.WithLabelValues(string(job.TypeBatch), string(bgtask.StatePaused)),
		},
		job.TypeDDL: {
			bgtask.StatePending: metrics.CurrentTaskCounter.WithLabelValues(string(job.TypeDDL), string(bgtask.StatePending)),
			bgtask.StateRunning: metrics.CurrentTaskCounter.WithLabelValues(string(job.TypeDDL), string(bgtask.StateRunning)),
			bgtask.StateDone:    metrics.CurrentTaskCounter.WithLabelValues(string(job.TypeDDL), string(bgtask.StateDone)),
			bgtask.StatePaused:  metrics.CurrentTaskCounter.WithLabelValues(string(job.TypeDDL), string(bgtask.StatePaused)),
		},
		job.TypeImportInto: {
			bgtask.StatePending: metrics.CurrentTaskCounter.WithLabelValues(string(job.TypeImportInto), string(bgtask.StatePending)),
			bgtask.StateRunning: metrics.CurrentTaskCounter.WithLabelValues(string(job.TypeImportInto), string(bgtask.StateRunning)),
			bgtask.StateDone:    metrics.CurrentTaskCounter.WithLabelValues(string(job.TypeImportInto), string(bgtask.StateDone)),
			bgtask.StatePaused:  metrics.CurrentTaskCounter.WithLabelValues(string(job.TypeImportInto), string(bgtask.StatePaused)),
		},
		job.TypeAutoAnalyze: {
			bgtask.StatePending: metrics.CurrentTaskCounter.WithLabelValues(string(job.TypeAutoAnalyze), string(bgtask.StatePending)),
			bgtask.StateRunning: metrics.CurrentTaskCounter.WithLabelValues(string(job.TypeAutoAnalyze), string(bgtask.StateRunning)),
			bgtask.StateDone:    metrics.CurrentTaskCounter.WithLabelValues(string(job.TypeAutoAnalyze), string(bgtask.StateDone)),
			bgtask.StatePaused:  metrics.CurrentTaskCounter.WithLabelValues(string(job.TypeAutoAnalyze), string(bgtask.StatePaused)),
		},
		job.TypeShared: {
			bgtask.StatePending: metrics.CurrentTaskCounter.WithLabelValues(string(job.TypeShared), string(bgtask.StatePending)),
			bgtask.StateRunning: metrics.CurrentTaskCounter.WithLabelValues(string(job.TypeShared), string(bgtask.StateRunning)),
			bgtask.StateDone:    metrics.CurrentTaskCounter.WithLabelValues(string(job.TypeShared), string(bgtask.StateDone)),
			bgtask.StatePaused:  metrics.CurrentTaskCounter.WithLabelValues(string(job.TypeShared), string(bgtask.StatePaused)),
		},
	}
	taskCompleteDuration = map[job.Type]prometheus.Observer{
		job.TypeBatch:       metrics.TaskCompleteDuration.WithLabelValues(string(job.TypeBatch)),
		job.TypeDDL:         metrics.TaskCompleteDuration.WithLabelValues(string(job.TypeDDL)),
		job.TypeImportInto:  metrics.TaskCompleteDuration.WithLabelValues(string(job.TypeImportInto)),
		job.TypeAutoAnalyze: metrics.TaskCompleteDuration.WithLabelValues(string(job.TypeAutoAnalyze)),
		job.TypeShared:      metrics.TaskCompleteDuration.WithLabelValues(string(job.TypeShared)),
	}
	taskQueueDuration = map[job.Type]prometheus.Observer{
		job.TypeBatch:       metrics.TaskQueueDuration.WithLabelValues(string(job.TypeBatch)),
		job.TypeDDL:         metrics.TaskQueueDuration.WithLabelValues(string(job.TypeDDL)),
		job.TypeImportInto:  metrics.TaskQueueDuration.WithLabelValues(string(job.TypeImportInto)),
		job.TypeAutoAnalyze: metrics.TaskQueueDuration.WithLabelValues(string(job.TypeAutoAnalyze)),
		job.TypeShared:      metrics.TaskQueueDuration.WithLabelValues(string(job.TypeShared)),
	}
}
