package http

import (
	"context"
	"testing"

	"dataservices/commons/config"

	"github.com/stretchr/testify/require"
	"github.com/tidbcloud/core-svc/idl/pbgen/proto/core"
	"github.com/tidbcloud/tiinf/transport/crossregion"
)

func TestProviderForRegionalHostPrefix(t *testing.T) {
	require.Empty(t, ProviderForRegionalHostPrefix("", core.DeployType_DEPLOY_TYPE_SHARED))
	require.Empty(t, ProviderForRegionalHostPrefix("aws", core.DeployType_DEPLOY_TYPE_SHARED))
	require.Equal(t, "alicloud", ProviderForRegionalHostPrefix("alicloud", core.DeployType_DEPLOY_TYPE_UNSPECIFIED))
	require.Equal(t, "alicloud", ProviderForRegionalHostPrefix("alicloud", core.DeployType_DEPLOY_TYPE_DEDICATED))
	require.Equal(t, "alicloud", ProviderForRegionalHostPrefix("alicloud", core.DeployType_DEPLOY_TYPE_HYBRID))
	require.Equal(t, "alicloud", ProviderForRegionalHostPrefix("AliCloud", core.DeployType_DEPLOY_TYPE_SHARED))
}

func TestO11yRegionInnerDomainWithHostPrefix(t *testing.T) {
	url, err := O11yRegionInnerDomainWithHostPrefix(crossregion.Prod, "cn-hangzhou", "")
	require.NoError(t, err)
	require.Equal(t, "https://cn-hangzhou.inner-region.o11y.prod.tidbcloud.com", url)

	url, err = O11yRegionInnerDomainWithHostPrefix(crossregion.Prod, "cn-hangzhou", "alicloud")
	require.NoError(t, err)
	require.Equal(t, "https://regionalsvc01.cn-hangzhou.prod.alicloud.tidbcloud.com", url)

	url, err = O11yRegionInnerDomainWithHostPrefix(crossregion.Dev, "ap-southeast-1", "alicloud")
	require.NoError(t, err)
	require.Equal(t, "https://regionalsvc01.ap-southeast-1.dev.shared.alicloud.tidbcloud.com", url)

	url, err = O11yRegionInnerDomainWithHostPrefix(crossregion.Staging, "ap-southeast-1", "alicloud")
	require.NoError(t, err)
	require.Equal(t, "https://regionalsvc01.ap-southeast-1.dev.shared.alicloud.tidbcloud.com", url)
}

func TestProviderScopedInnerDataServicePath(t *testing.T) {
	require.Equal(t, "/inner/dataservice/exec/sql", ProviderScopedInnerDataServicePath("", "/inner/dataservice/exec/sql"))
	require.Equal(t, "/dataservice/inner/dataservice/exec/sql", ProviderScopedInnerDataServicePath("alicloud", "/inner/dataservice/exec/sql"))
}

func TestProviderScopedInnerDataServiceHost(t *testing.T) {
	host, err := ProviderScopedInnerDataServiceHost(crossregion.Dev, "us-west-2", "")
	require.NoError(t, err)
	require.Equal(t, "us-west-2.inner-region.o11y.dev.tidbcloud.com", host)

	host, err = ProviderScopedInnerDataServiceHost(crossregion.Dev, "us-west-2", "alicloud")
	require.NoError(t, err)
	require.Equal(t, "regionalsvc01.us-west-2.dev.shared.alicloud.tidbcloud.com", host)
}

func TestPostRequestToProviderO11yRegionUsesLocalGatewayInLocalMode(t *testing.T) {
	cfg := config.Global()
	oldLocalMode := cfg.ServerConf.LocalMode
	oldGatewayAddr := cfg.GrpcConf.DataserviceGatewayAddr
	oldEnv := cfg.ServerConf.Env
	oldToken := cfg.ServerConf.CrossRegionToken
	defer func() {
		cfg.ServerConf.LocalMode = oldLocalMode
		cfg.GrpcConf.DataserviceGatewayAddr = oldGatewayAddr
		cfg.ServerConf.Env = oldEnv
		cfg.ServerConf.CrossRegionToken = oldToken
	}()

	cfg.ServerConf.LocalMode = true
	cfg.GrpcConf.DataserviceGatewayAddr = "127.0.0.1:1"
	cfg.ServerConf.Env = "dev"
	cfg.ServerConf.CrossRegionToken = "test-token"

	err := postRequestToProviderO11yRegion(context.Background(), "dataservice-dataapp-gateway", "us-west-2", "alicloud", "/inner/dataservice/exec/sql", nil, nil)
	require.Error(t, err)
	require.Contains(t, err.Error(), "uses local gateway")
}
