package resources

import (
	"encoding/json"

	"github.com/prometheus/client_golang/prometheus"
	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
	"k8s.io/apimachinery/pkg/runtime/schema"

	cloudv1 "github.com/tidbcloud/infra-api/api/v1"
)

var (
	configChangeGVR = schema.GroupVersionResource{
		Group:    "cloud.pingcap.com",
		Version:  "v1",
		Resource: "configchanges",
	}

	configChangeInfo = prometheus.NewDesc(
		prometheus.BuildFQName("infra", "exporter", "configchange"),
		"Information about ConfigChange CR.",
		[]string{
			"namespace",
			"name",
			"cluster_name",
			"phase",
			"strategy",
		}, nil)
)

type configChange struct {
	defaultResource
}

var _ Interface = &configChange{}

func (uo configChange) HasDedicatedLabel() bool {
	return false
}

func (uo configChange) GVR() schema.GroupVersionResource {
	return configChangeGVR
}

func (uo configChange) Desc() *prometheus.Desc {
	return configChangeInfo
}

func (uo configChange) FilterOut(_ *unstructured.Unstructured) bool { return false }

func (uo configChange) Extract(obj *unstructured.Unstructured) prometheus.Metric {
	bytes, _ := obj.MarshalJSON()

	var configChangeCR cloudv1.ConfigChange
	_ = json.Unmarshal(bytes, &configChangeCR)

	return prometheus.MustNewConstMetric(
		configChangeInfo,
		prometheus.GaugeValue,
		1.0,
		configChangeCR.Namespace,
		configChangeCR.Name,
		configChangeCR.Spec.ClusterName,
		string(configChangeCR.Status.Phase),
		string(configChangeCR.Spec.ChangeStrategy),
	)
}
