package namer

const (
	TiflowFormat = "tiflow"
)

const (
	TiflowNamespaceSelectorKey = "tiflow-namespace"
	TiflowClusterSelectorKey   = "tiflow-cluster"
	TiflowSpecLabelKey         = "tiflow-spec"
)

type TiflowNamer struct {
	networkName                    string
	tiflowClusterMasterManagerType string
	tiflowClusterMasterManagerName string

	networkNamespace  string
	tiflowNamespace   string
	tiflowClusterName string
	tiflowSpecLabel   string
}

func NewTiflowNamer() *TiflowNamer {
	return &TiflowNamer{}
}

func (n *TiflowNamer) WithTiflowClusterName(clusterName string) *TiflowNamer {
	var res = *n
	res.tiflowClusterName = clusterName
	return &res
}

func (n *TiflowNamer) GetTiflowClusterName() string {
	return n.tiflowClusterName
}

func (n *TiflowNamer) WithTiflowNamespace(ns string) *TiflowNamer {
	res := *n
	res.tiflowNamespace = ns
	return &res
}

func (n *TiflowNamer) GetTiflowNamespace() string {
	return n.tiflowNamespace
}

func (n *TiflowNamer) WithNetworkName(networkName string) *TiflowNamer {
	var res = *n
	res.networkName = networkName
	return &res
}

func (n *TiflowNamer) WithNetworkNamespace(networkNamespace string) *TiflowNamer {
	var res = *n
	res.networkNamespace = networkNamespace
	return &res
}

func (n *TiflowNamer) GetNetworkName() string {
	return n.networkName
}

func (n *TiflowNamer) WithTiflowClusterMasterManagerType(name string) *TiflowNamer {
	var res = *n
	res.tiflowClusterMasterManagerType = name
	return &res
}

func (n *TiflowNamer) WithTiflowClusterMasterManagerName(name string) *TiflowNamer {
	var res = *n
	res.tiflowClusterMasterManagerName = name
	return &res
}

func (n *TiflowNamer) GetTiflowClusterMasterManagerType() string {
	return n.tiflowClusterMasterManagerType
}

func (n *TiflowNamer) GetTiflowClusterMasterManagerName() string {
	return n.tiflowClusterMasterManagerName
}

func (n *TiflowNamer) WithTiflowSpecLabel(name string) *TiflowNamer {
	var res = *n
	res.tiflowSpecLabel = name
	return &res
}

func (n *TiflowNamer) GetTiflowSpecLabel() string {
	return n.tiflowSpecLabel
}

func (n *TiflowNamer) LabelsWithoutSpecLabel() map[string]string {
	labels := n.Labels()
	delete(labels, TiflowSpecLabelKey)
	return labels
}

func (n *TiflowNamer) Labels() map[string]string {
	res := map[string]string{
		LegacyNetworkSelectorKey:          n.networkName,
		TiflowNamespaceSelectorKey:        n.tiflowNamespace,
		TiflowClusterSelectorKey:          n.tiflowClusterName,
		TiflowSpecLabelKey:                n.tiflowSpecLabel,
		LegacyNetworkNamespaceSelectorKey: n.networkNamespace,
	}
	for key, value := range res {
		if value == "" {
			delete(res, key)
		}
	}

	return res
}
