package layoutbundleslotv1

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

	"github.com/pingcap-inc/nexuscrm-contract/pkg/appauthority"
)

// LayoutBundleSlotRevisionDigest returns the identity of AppID plus the exact
// canonical slot component descriptor. The component must be a structurally
// valid v1 slot descriptor; package graph and behavior verification are owned
// by VerifyPackageDeclarations.
func LayoutBundleSlotRevisionDigest(appID string, component appauthority.Component) (string, error) {
	if err := appauthority.ValidateAppID(appID); err != nil {
		return "", fmt.Errorf("layout-bundle slot revision AppID: %w", err)
	}
	if _, err := validateSlotDescriptor(component); err != nil {
		return "", err
	}
	descriptor, err := appauthority.CanonicalComponentDescriptor(component)
	if err != nil {
		return "", fmt.Errorf("canonical layout-bundle slot descriptor: %w", err)
	}
	envelope := make([]byte, 0, len(descriptor)+len(appID)+32)
	envelope = append(envelope, `{"app_id":"`...)
	envelope = append(envelope, appID...)
	envelope = append(envelope, `","component":`...)
	envelope = append(envelope, descriptor...)
	envelope = append(envelope, '}')
	hash := sha256.New()
	_, _ = hash.Write([]byte(RevisionDigestDomain))
	_, _ = hash.Write(envelope)
	return "sha256:" + hex.EncodeToString(hash.Sum(nil)), nil
}
