package infraprovider

import (
	"database/sql/driver"
	"strings"

	"github.com/pingcap/errors"
)

// Name is IaaS _ runtime.
// We use GKE instead of just saying K8s.
// This is because we could support a non-GKE k8s deployment.
type Name string

// Infrastructure and runtime environemtn
const (
	// LocalDind is a laptop environment
	LocalDind Name = "local_dind"
	LocalTest Name = "local_test"
	GcpGke    Name = "gcp_gke"
	AwsEks    Name = "aws_eks"
	AzureAks  Name = "azure_aks"

	// TenantTag is the billing tag name
	TenantTag      = "tenant"
	ProjectTag     = "project"
	EnvTag         = "env"
	ComponentTag   = "component"
	UsedByTag      = "usedby"
	UsedByCustomer = "customer-tidb"
)

// Scan TODO: generate this
func (u *Name) Scan(value interface{}) error {
	*u = Name(value.([]byte))
	return nil
}

// Value TODO: generate this
func (u Name) Value() (driver.Value, error) { return string(u), nil }

func (u Name) String() string {
	return string(u)
}

// StringToProviderName converts an input string to a provider.Name
func StringToProviderName(in string) (Name, error) {
	var name Name
	switch in {
	case "local_dind":
		name = LocalDind
	case "local_test":
		name = LocalTest
	case "gcp_gke":
		name = GcpGke
	case "aws_eks":
		name = AwsEks
	case "azure_aks":
		name = AzureAks
	default:
		return name, errors.New("not a provider name: " + in)
	}
	return name, nil
}

// GetAccountNameFromProject gets the account name from the project
func GetAccountNameFromProject(name string) string {
	parts := strings.Split(name, "-")
	return parts[len(parts)-1]
}
