package controller

import (
	"k8s.io/client-go/tools/cache"
	"k8s.io/client-go/util/workqueue"
)

type noopMetric struct{}

func (noopMetric) Inc()            {}
func (noopMetric) Dec()            {}
func (noopMetric) Observe(float64) {}
func (noopMetric) Set(float64)     {}

type noopWorkqueueMetricsProvider struct{}

func (noopWorkqueueMetricsProvider) NewDepthMetric(name string) workqueue.GaugeMetric {
	return noopMetric{}
}

func (noopWorkqueueMetricsProvider) NewAddsMetric(name string) workqueue.CounterMetric {
	return noopMetric{}
}

func (noopWorkqueueMetricsProvider) NewLatencyMetric(name string) workqueue.SummaryMetric {
	return noopMetric{}
}

func (noopWorkqueueMetricsProvider) NewWorkDurationMetric(name string) workqueue.SummaryMetric {
	return noopMetric{}
}

func (noopWorkqueueMetricsProvider) NewRetriesMetric(name string) workqueue.CounterMetric {
	return noopMetric{}
}

type noopCacheMetricsProvider struct{}

func (noopCacheMetricsProvider) NewListsMetric(name string) cache.CounterMetric { return noopMetric{} }
func (noopCacheMetricsProvider) NewListDurationMetric(name string) cache.SummaryMetric {
	return noopMetric{}
}
func (noopCacheMetricsProvider) NewItemsInListMetric(name string) cache.SummaryMetric {
	return noopMetric{}
}
func (noopCacheMetricsProvider) NewWatchesMetric(name string) cache.CounterMetric { return noopMetric{} }
func (noopCacheMetricsProvider) NewShortWatchesMetric(name string) cache.CounterMetric {
	return noopMetric{}
}
func (noopCacheMetricsProvider) NewWatchDurationMetric(name string) cache.SummaryMetric {
	return noopMetric{}
}
func (noopCacheMetricsProvider) NewItemsInWatchMetric(name string) cache.SummaryMetric {
	return noopMetric{}
}
func (noopCacheMetricsProvider) NewLastResourceVersionMetric(name string) cache.GaugeMetric {
	return noopMetric{}
}

func DisableAllControllerMetrics() {
	DisableControllerReflectorMetrics()
	DisableControllerWorkqueuMetrics()
}

func DisableControllerWorkqueuMetrics() {
	workqueue.SetProvider(noopWorkqueueMetricsProvider{})
}

func DisableControllerReflectorMetrics() {
	cache.SetReflectorMetricsProvider(noopCacheMetricsProvider{})
}
