package informers

import (
	"time"

	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/apimachinery/pkg/fields"
	corev1informers "k8s.io/client-go/informers/core/v1"
	"k8s.io/client-go/kubernetes"
	corev1listers "k8s.io/client-go/listers/core/v1"
	"k8s.io/client-go/tools/cache"
)

type configMapInformer struct {
	informer cache.SharedIndexInformer
	lister   corev1listers.ConfigMapLister
}

func NewConfigMapInformer(
	client kubernetes.Interface,
	namespace string,
	name string,
	resyncPeriod time.Duration,
) corev1informers.ConfigMapInformer {
	indexers := cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}
	options := func(lo *metav1.ListOptions) {
		lo.FieldSelector = fields.OneTermEqualSelector(metav1.ObjectNameField, name).String()
	}
	informer := corev1informers.NewFilteredConfigMapInformer(
		client,
		namespace,
		resyncPeriod,
		indexers,
		options,
	)
	lister := corev1listers.NewConfigMapLister(informer.GetIndexer())
	return &configMapInformer{informer, lister}
}

func (i *configMapInformer) Informer() cache.SharedIndexInformer {
	return i.informer
}

func (i *configMapInformer) Lister() corev1listers.ConfigMapLister {
	return i.lister
}