package proxy

import (
	"testing"

	"github.com/stretchr/testify/require"

	"github.com/pingcap-inc/clinic/pkg/db"
	"github.com/pingcap-inc/clinic/pkg/o11y"
)

func TestNextGenHistoricalMetricsRegion(t *testing.T) {
	tests := []struct {
		name      string
		provider  string
		region    string
		clusterID string
		want      string
	}{
		{name: "ap southeast 2 uses ng", provider: "aws", region: "ap-southeast-2", want: "ap-southeast-2-ng"},
		{name: "ap southeast 1 keeps premium", provider: "aws", region: "ap-southeast-1", want: "ap-southeast-1-premium"},
		{name: "ap south 1 stays raw", provider: "aws", region: "ap-south-1", want: "ap-south-1"},
		{name: "new us west 2 uses premium", provider: "aws", region: "us-west-2", clusterID: "new-cluster", want: "us-west-2-premium"},
		{name: "historical us west 2 stays raw", provider: "aws", region: "us-west-2", clusterID: "1900012584357058", want: "us-west-2"},
		{name: "other aws region stays raw", provider: "aws", region: "eu-central-1", want: "eu-central-1"},
		{name: "non aws stays raw", provider: "gcp", region: "us-west1", want: "us-west1"},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			require.Equal(t, tt.want, nextGenHistoricalMetricsRegion(tt.provider, tt.region, tt.clusterID))
		})
	}
}

func TestNextGenHistoricalMetricsTargetSeparatesLogicalAndPhysicalRegion(t *testing.T) {
	client, err := o11y.New(
		"https://gs.example.com",
		"www.ds.%s.%s.example.com",
		"client-id",
		"client-secret",
		"dev",
	)
	require.NoError(t, err)

	targetHost, listParam := nextGenHistoricalMetricsTarget(client, &db.Cluster{
		DeployType:    o11y.NgHostType,
		Provider:      "aws",
		Region:        "ap-southeast-2",
		TenantID:      100,
		ClusterID:     "cluster-1",
		DataPlaneName: "data-plane-1",
	})

	require.Equal(t, "www.ds.ap-southeast-2-ng.aws.example.com", targetHost)
	require.Equal(t, "ap-southeast-2", listParam.Region)
	require.Equal(t, "aws", listParam.Vendor)
	require.Equal(t, "100", listParam.TenantID)
	require.Empty(t, listParam.ProjectID)
	require.Equal(t, "data-plane-1", listParam.ApplicationID)
	require.Equal(t, "dev-tidbcloud-nextgen", listParam.BizType)
	require.True(t, listParam.ShowDeleted)

	path := client.GenHistoricalDataProxyPath(
		"/api/v1/query_range",
		listParam.BizType,
		listParam.TenantID,
		listParam.ProjectID,
		listParam.ApplicationID,
	)
	require.Equal(t, "/historical/metrics/api/v1/dev-tidbcloud-nextgen/orgs/100/clusters/data-plane-1/prometheus/query_range", path)
}
