package resource

import (
	"sigs.k8s.io/controller-runtime/pkg/client"

	cloudv1 "github.com/tidbcloud/infra-api/api/v1"
	namerutil "github.com/tidbcloud/infra-provider/pkg/namer"
)

const defaultNameLimit = 63

type Namer interface {
	Name() string
}

type ZonalNamer interface {
	WithZone(zone string) Namer
}

func (t NetworkResource) Namer(network *cloudv1.Network) Namer {
	n := newNamer(network)
	n.identity = string(t)

	return n
}

func (t NetworkZonalResource) Namer(network *cloudv1.Network) ZonalNamer {
	n := newNamer(network)
	n.identity = string(t)

	return n
}

func (t ClusterResource) Namer(cluster *cloudv1.Cluster) Namer {
	n := newNamer(cluster)
	n.identity = string("c-" + t)

	return n
}

type namer struct {
	obj      client.Object
	limit    int
	identity string
	zone     string
}

func newNamer(obj client.Object) *namer {
	return &namer{
		obj:   obj,
		limit: defaultNameLimit,
	}
}

func (n *namer) Name() string {
	var suffix string
	if n.zone != "" {
		suffix = "-" + n.zone
	}
	prefix := namerutil.UniqueIdentifierV2(n.obj, namerutil.WithPrefix(n.identity), namerutil.WithLimit(n.limit-len(suffix)))
	return prefix + suffix
}

func (n *namer) WithZone(zone string) Namer {
	n.zone = zone
	return n
}
