package systemlayoutbundleauthorityv1

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

// SlotValueDigest returns lowercase sha256:<64 lowercase hex> over the exact
// complete canonical slot value.
func SlotValueDigest(value SystemLayoutBundleSlotV1) (string, error) {
	canonical, err := CanonicalSlotValueBytes(value)
	if err != nil {
		return "", err
	}
	return digestBytes(canonical), nil
}

// CommandRequestDigest returns lowercase sha256:<64 lowercase hex> over the
// exact request bytes. CommandID is the idempotency key and is not an input.
func CommandRequestDigest(request SystemLayoutBundleSlotCommandRequest) (string, error) {
	canonical, err := CanonicalCommandRequestBytes(request)
	if err != nil {
		return "", err
	}
	return digestBytes(canonical), nil
}

// EvidenceDigest returns lowercase sha256:<64 lowercase hex> over the exact
// complete canonical evidence value.
func EvidenceDigest(evidence SystemLayoutBundleAuthorityEvidenceV1) (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[:])
}
