package tenantlayoutbundleauthorityv1

import (
	"crypto/sha256"
	"encoding/hex"
)

func NamespaceValueDigest(value TenantNamespaceReservationV1) (string, error) {
	canonical, err := CanonicalNamespaceValueBytes(value)
	if err != nil {
		return "", err
	}
	return digestBytes(canonical), nil
}

func OrgBindingValueDigest(value TenantOrgNamespaceBindingV1) (string, error) {
	canonical, err := CanonicalOrgBindingValueBytes(value)
	if err != nil {
		return "", err
	}
	return digestBytes(canonical), nil
}

func SlotValueDigest(value TenantLayoutBundleSlotV1) (string, error) {
	canonical, err := CanonicalSlotValueBytes(value)
	if err != nil {
		return "", err
	}
	return digestBytes(canonical), nil
}

func NamespaceCommandRequestDigest(request TenantNamespaceCommandRequest) (string, error) {
	canonical, err := CanonicalNamespaceCommandRequestBytes(request)
	if err != nil {
		return "", err
	}
	return digestBytes(canonical), nil
}

func OrgBindingCommandRequestDigest(request TenantOrgNamespaceBindingCommandRequest) (string, error) {
	canonical, err := CanonicalOrgBindingCommandRequestBytes(request)
	if err != nil {
		return "", err
	}
	return digestBytes(canonical), nil
}

func SlotCommandRequestDigest(request TenantLayoutBundleSlotCommandRequest) (string, error) {
	canonical, err := CanonicalSlotCommandRequestBytes(request)
	if err != nil {
		return "", err
	}
	return digestBytes(canonical), nil
}

func EvidenceDigest(evidence TenantLayoutBundleAuthorityEvidenceV1) (string, error) {
	canonical, err := CanonicalEvidenceBytes(evidence)
	if err != nil {
		return "", err
	}
	return digestBytes(canonical), nil
}

func digestBytes(value []byte) string {
	digest := sha256.Sum256(value)
	return "sha256:" + hex.EncodeToString(digest[:])
}
