package metrics

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

	"edge-infra.dev/pkg/k8s/runtime/controller/metrics"

	l5dv1alpha1 "edge-infra.dev/pkg/edge/linkerd/k8s/apis/linkerd/v1alpha1"
)

var LinkerdReadinessMetric prometheus.GaugeVec = *prometheus.NewGaugeVec(
	prometheus.GaugeOpts{
		Name: metrics.Name("linkerd", "reconcile_readiness"),
		Help: "Metric for linkerd controller readiness",
	},
	[]string{"type", "status", "reason", "version"})

var TrustAnchorExpiry prometheus.GaugeVec = *prometheus.NewGaugeVec(
	prometheus.GaugeOpts{
		Name: metrics.Name("linkerd", "trust_anchor_expiry"),
		Help: "Metric for linkerd trust anchor expiration date as UNIX timestamp",
	},
	[]string{},
)

var WorkloadInjectionReadinessMetric prometheus.GaugeVec = *prometheus.NewGaugeVec(
	prometheus.GaugeOpts{
		Name: metrics.Name("workloadinjection", "reconcile_readiness"),
		Help: "Metric for linkerd workload injection controller readiness",
	},
	[]string{"type", "reason", "status"})

func RecordLinkerdReadiness(l5d *l5dv1alpha1.Linkerd) {
	LinkerdReadinessMetric.Reset()
	for _, condition := range l5d.Status.Conditions {
		labels := prometheus.Labels{
			"type":    condition.Type,
			"status":  string(condition.Status),
			"reason":  condition.Reason,
			"version": l5d.Status.Version,
		}
		if condition.Status == "False" || condition.Status == "Unknown" {
			LinkerdReadinessMetric.With(labels).Set(0)
		} else if condition.Status == "True" {
			LinkerdReadinessMetric.With(labels).Set(1)
		}
	}
}

func RecordTrustAnchorExpiryTime(expiry float64) {
	labels := prometheus.Labels{}
	TrustAnchorExpiry.With(labels).Set(float64(expiry))
}

func RecordWorkloadInjectionReadiness(workloadInjection *l5dv1alpha1.LinkerdWorkloadInjection) {
	WorkloadInjectionReadinessMetric.Reset()
	for _, condition := range workloadInjection.Status.Conditions {
		labels := prometheus.Labels{
			"type":   condition.Type,
			"status": string(condition.Status),
			"reason": condition.Reason,
		}
		if condition.Status == "False" || condition.Status == "Unknown" {
			WorkloadInjectionReadinessMetric.With(labels).Set(0)
		} else if condition.Status == "True" {
			WorkloadInjectionReadinessMetric.With(labels).Set(1)
		}
	}
}