package prometheus

import (
	"context"
	"encoding/json"
	"net/http"
	"net/http/httptest"
	"sync"
	"testing"
	"time"

	confMetrics "github.com/pingcap-inc/clinic/clinic_data_service/pkg/config/metrics"
	"github.com/pingcap-inc/clinic/clinic_data_service/pkg/model"
	"github.com/stretchr/testify/require"
)

func TestMetricsQueryBatchWithRangePremiumUsesPhysicalClusterID(t *testing.T) {
	var mu sync.Mutex
	var gotQueries []string

	server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		require.Equal(t, "/api/v1/query_range", r.URL.Path)
		require.NoError(t, r.ParseForm())
		mu.Lock()
		gotQueries = append(gotQueries, r.Form.Get("query"))
		mu.Unlock()

		w.Header().Set("Content-Type", "application/json")
		require.NoError(t, json.NewEncoder(w).Encode(map[string]any{
			"status": "success",
			"data": map[string]any{
				"resultType": "matrix",
				"result":     []any{},
			},
		}))
	}))
	t.Cleanup(server.Close)

	cluster := model.Cluster{
		ClusterID:         "logical-cluster",
		PhysicalClusterID: "physical-cluster",
		DeployType:        "premium",
		ClusterMetricsURL: server.URL + "/api/v1/",
	}

	MetricsQueryBatchWithRange(
		context.Background(),
		cluster,
		[]confMetrics.MetricsQueryConfig{{
			Name:         "QPS",
			PrimaryQuery: `sum(rate(tidb_server_query_total{tidb_cluster_id="$tidb_cluster"}[$rate]))`,
		}},
		time.Date(2026, 5, 12, 0, 0, 0, 0, time.UTC),
		time.Date(2026, 5, 12, 1, 0, 0, 0, time.UTC),
	)

	mu.Lock()
	defer mu.Unlock()
	require.Len(t, gotQueries, 2)
	for _, query := range gotQueries {
		require.Contains(t, query, `tidb_cluster_id="physical-cluster"`)
		require.NotContains(t, query, "logical-cluster")
	}
}
