package central_thanos

import (
	"context"
	"testing"

	"github.com/tidbcloud/metrics-integration/pipeline/central/config"
	"github.com/tidbcloud/metrics-integration/pipeline/central/metrics/prom"
)

func TestBuildNodeCPUSecondsTotalRateQuerierMetricMetadata(t *testing.T) {
	cluster := &config.TargetCluster{ServicePlan: "Dedicated"}

	metric, err := BuildNodeCPUSecondsTotalRateQuerier(cluster)(context.Background())
	if err == nil {
		t.Fatal("BuildNodeCPUSecondsTotalRateQuerier() error = nil, want missing datasource error")
	}

	vec, ok := metric.(*prom.VecMetric)
	if !ok {
		t.Fatalf("BuildNodeCPUSecondsTotalRateQuerier() metric type = %T, want *prom.VecMetric", metric)
	}
	if vec.Name != "tidbcloud_node_cpu_seconds_total_rate" {
		t.Fatalf("metric name = %q, want tidbcloud_node_cpu_seconds_total_rate", vec.Name)
	}
	if vec.Type != "gauge" {
		t.Fatalf("metric type = %q, want gauge", vec.Type)
	}
	if vec.ServicePlan != "Dedicated" {
		t.Fatalf("metric service plan = %q, want Dedicated", vec.ServicePlan)
	}
}

func TestBuildNodeCPUUsedSecondsRatePromQL(t *testing.T) {
	want := `sum(rate(node_cpu_seconds_total{mode!="idle", cluster_id="tidb123"}[120s])) by (component, instance)`
	if got := buildNodeCPUUsedSecondsRatePromQL(`cluster_id="tidb123"`); got != want {
		t.Fatalf("buildNodeCPUUsedSecondsRatePromQL() = %q, want %q", got, want)
	}
}

func TestShouldIncludeResourceGroupLabelForRUTotal(t *testing.T) {
	tests := []struct {
		name        string
		servicePlan string
		want        bool
	}{
		{name: "dedicated includes resource group", servicePlan: "Dedicated", want: true},
		{name: "premium includes resource group", servicePlan: "Premium", want: true},
		{name: "essential excludes resource group", servicePlan: "Essential", want: false},
		{name: "starter excludes resource group", servicePlan: "Starter", want: false},
		{name: "trimmed starter excludes resource group", servicePlan: " Starter ", want: false},
		{name: "trimmed premium includes resource group", servicePlan: " Premium ", want: true},
		{name: "trimmed dedicated includes resource group", servicePlan: " Dedicated ", want: true},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			if got := shouldIncludeResourceGroupLabelForRUTotal(tt.servicePlan); got != tt.want {
				t.Fatalf("shouldIncludeResourceGroupLabelForRUTotal(%q) = %v, want %v", tt.servicePlan, got, tt.want)
			}
		})
	}
}
