package collectors

import (
	"context"

	"github.com/go-logr/logr"
	"github.com/prometheus/client_golang/prometheus"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/consts"
	"github.com/upbound/provider-aws/apis/eks/v1beta1"
	"sigs.k8s.io/controller-runtime/pkg/client"
)

var (
	eksInfo = prometheus.NewDesc(
		"dataplane_manager_eks_info",
		"Information about EKS CR.",
		[]string{
			"name",
			"tenant_id",
			"region",
			"status",
		}, nil)
)

type eks struct {
	cli client.Client
	log logr.Logger
}

var _ prometheus.Collector = &eks{}

func (e *eks) Describe(ch chan<- *prometheus.Desc) {
	ch <- eksInfo
}

func (e *eks) Collect(ch chan<- prometheus.Metric) {
	eksList := &v1beta1.ClusterList{}
	if err := e.cli.List(context.Background(), eksList); err != nil {
		e.log.Error(err, "fetching eksList")
		return
	}
	for _, eksCR := range eksList.Items {
		tenant := eksCR.GetLabels()[consts.TenantLabelKey]
		var region string
		var status string
		if eksCR.Spec.ForProvider.Region == nil {
			region = "unknown"
		} else {
			region = *eksCR.Spec.ForProvider.Region
		}
		if eksCR.Status.AtProvider.Status == nil {
			status = "unknown"
		} else {
			status = *eksCR.Status.AtProvider.Status
		}
		ch <- prometheus.MustNewConstMetric(
			eksInfo,
			prometheus.GaugeValue,
			1.0,
			eksCR.Name,
			tenant,
			region,
			status,
		)
	}
}
