package http

import (
	"fmt"
	"strings"

	"dataservices/commons/constants"

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

func ProviderForRegionalHostPrefix(provider string, _ core.DeployType) string {
	provider = strings.ToLower(strings.TrimSpace(provider))
	// AliCloud regional traffic always uses the provider-scoped host. AWS keeps
	// the legacy cross-region domain unchanged.
	if provider != constants.ClusterCloudProviderAliCloud {
		return ""
	}
	return provider
}

func O11yRegionInnerDomainWithHostPrefix(env crossregion.EnvType, region, hostPrefix string) (string, error) {
	hostPrefix = strings.ToLower(strings.TrimSpace(hostPrefix))
	if hostPrefix == constants.ClusterCloudProviderAliCloud {
		if env == crossregion.Prod {
			return fmt.Sprintf("https://regionalsvc01.%s.prod.alicloud.tidbcloud.com", region), nil
		}
		// AliCloud non-prod currently uses a shared regional gateway domain for
		// both dev and staging.
		return fmt.Sprintf("https://regionalsvc01.%s.dev.shared.alicloud.tidbcloud.com", region), nil
	}

	baseURL, err := crossregion.GetO11yRegionInnerDomain(env, region)
	if err != nil {
		return "", err
	}
	if hostPrefix == "" {
		return baseURL, nil
	}
	return strings.Replace(baseURL, "https://", "https://"+hostPrefix+".", 1), nil
}

func ProviderScopedInnerDataServicePath(provider, url string) string {
	provider = strings.ToLower(strings.TrimSpace(provider))
	if provider == constants.ClusterCloudProviderAliCloud {
		// Only the upstream AliCloud API gateway needs the extra prefix for route
		// matching. The regional service still exposes /inner/dataservice/*.
		return "/dataservice" + url
	}
	return url
}

func ProviderScopedInnerDataServiceHost(env crossregion.EnvType, region, provider string) (string, error) {
	baseURL, err := O11yRegionInnerDomainWithHostPrefix(env, region, provider)
	if err != nil {
		return "", err
	}
	return strings.TrimPrefix(baseURL, "https://"), nil
}
