package metrics

import "github.com/prometheus/client_golang/prometheus"

const (
	eventJobSubsystem = "event_job"
	cronJobSubsystem  = "cron_job"
)

var (
	ServiceEventJob *serviceEventJobMetrics
	ServiceCronJob  *serviceCronJobMetrics
)

func RegisterServiceMetrics(namespace string) {
	ServiceEventJob = &serviceEventJobMetrics{
		SyncCount: prometheus.NewCounterVec(
			prometheus.CounterOpts{
				Namespace: namespace,
				Subsystem: eventJobSubsystem,
				Name:      "sync_count_total",
				Help:      "How many times an event job sync is executed.",
			},
			[]string{"service_name", "job_name", "result"},
		),
		SyncDur: prometheus.NewSummaryVec(
			prometheus.SummaryOpts{
				Namespace: namespace,
				Subsystem: eventJobSubsystem,
				Name:      "sync_duration_seconds",
				Help:      "How long it takes to execute an event job sync.",
			},
			[]string{"service_name", "job_name", "result"},
		),
	}
	ServiceCronJob = &serviceCronJobMetrics{
		SyncCount: prometheus.NewCounterVec(
			prometheus.CounterOpts{
				Namespace: namespace,
				Subsystem: cronJobSubsystem,
				Name:      "sync_count_total",
				Help:      "How many times a cron job sync is executed.",
			},
			[]string{"service_name", "job_name", "result"},
		),
		SyncDur: prometheus.NewSummaryVec(
			prometheus.SummaryOpts{
				Namespace: namespace,
				Subsystem: cronJobSubsystem,
				Name:      "sync_duration_seconds",
				Help:      "How long it takes to execute a cron job sync.",
			},
			[]string{"service_name", "job_name", "result"},
		),
	}

	prometheus.MustRegister(
		ServiceEventJob.SyncCount, ServiceEventJob.SyncDur,
		ServiceCronJob.SyncCount, ServiceCronJob.SyncDur,
	)
}

type serviceEventJobMetrics struct {
	SyncCount *prometheus.CounterVec
	SyncDur   *prometheus.SummaryVec
}

type serviceCronJobMetrics struct {
	SyncCount *prometheus.CounterVec
	SyncDur   *prometheus.SummaryVec
}
