package factory

import (
	"context"
	"crypto/sha1"
	"encoding/hex"

	v1 "k8s.io/api/core/v1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"sigs.k8s.io/controller-runtime/pkg/client"
)

const (
	revisionLen = 12
)

// GenRevision generates the revision according to the pod spec and data of given config map keys.
func GenRevision(
	ctx context.Context,
	namespace string,
	clusterCli client.Client,
	podSpec *v1.PodSpec,
	cmKeys ...string,
) (string, error) {
	h := sha1.New()

	podByte, err := podSpec.Marshal()
	if err != nil {
		return "", err
	}
	h.Write(podByte)

	for _, cmKey := range cmKeys {
		if cmKey == "" {
			continue
		}
		configMap := &v1.ConfigMap{}
		if err := clusterCli.Get(ctx,
			client.ObjectKey{
				Name:      cmKey,
				Namespace: namespace,
			}, configMap); err != nil {
			return "", err
		}
		configMap.ObjectMeta = metav1.ObjectMeta{}
		configMap.Immutable = nil
		cmByte, err := configMap.Marshal()
		if err != nil {
			return "", err
		}
		h.Write(cmByte)
	}

	return hex.EncodeToString(h.Sum(nil))[:revisionLen], nil
}
