package layoutbundleslotv1

import "github.com/pingcap-inc/nexuscrm-contract/pkg/layoutbundlekeyv1"

const (
	// ComponentKind is the registered App-authority component kind for one
	// stable App-owned layout-bundle slot.
	ComponentKind = "io.nexuscrm.layout-bundle-slot.v1"
	// ComponentFormatVersion is the only descriptor format accepted by v1.
	ComponentFormatVersion uint32 = 1
	// BehaviorSchemaVersion is the closed canonical behavior schema.
	BehaviorSchemaVersion = "nexuscrm.layout-bundle-slot/v1"
	// RevisionDigestDomain separates complete slot descriptor revisions from
	// component behavior, AppRelease, and MetadataBundle digests.
	RevisionDigestDomain = "nexuscrm.layout-bundle-slot-revision.v1\x00"
)

// Behavior is the closed canonical behavior of one slot declaration revision.
// A nil PreviousTargetComponentID means the member is absent, not null.
type Behavior struct {
	SchemaVersion             string
	LocalComponentKey         layoutbundlekeyv1.LocalComponentKey
	TargetComponentID         string
	PreviousTargetComponentID *string
}

// Declaration is one verified slot declaration extracted from a signed App
// package. RevisionDigest commits AppID and the complete canonical component
// descriptor; BehaviorDigest is the descriptor's content_digest.
type Declaration struct {
	AppID                     string
	NamespaceID               string
	LocalComponentKey         layoutbundlekeyv1.LocalComponentKey
	DeclarationComponentID    string
	DefinitionVersion         uint64
	TargetComponentID         string
	PreviousTargetComponentID *string
	BehaviorDigest            string
	RevisionDigest            string
}

// AcceptedRevision is the immutable fact stored at one global definition
// version in an App-slot lineage.
type AcceptedRevision struct {
	DefinitionVersion         uint64
	RevisionDigest            string
	TargetComponentID         string
	PreviousTargetComponentID *string
}

// Lineage is the complete contiguous global registration history for one
// immutable App-owned slot reservation. Revisions are ordered by
// DefinitionVersion beginning at one.
type Lineage struct {
	AppID                  string
	NamespaceID            string
	LocalComponentKey      layoutbundlekeyv1.LocalComponentKey
	DeclarationComponentID string
	Revisions              []AcceptedRevision
}

// TransitionKind distinguishes absence-CAS creation, no-write historical
// reuse, and head-CAS successor append.
type TransitionKind string

const (
	TransitionInitial         TransitionKind = "initial"
	TransitionExactReuse      TransitionKind = "exact-reuse"
	TransitionAppendSuccessor TransitionKind = "append-successor"
)

// Transition is a pure registration decision. Initial expects no current
// reservation. ExactReuse performs no lineage write. AppendSuccessor must CAS
// the exact prior head version and digest before storing Candidate.
type Transition struct {
	Kind                       TransitionKind
	ExpectedHeadVersion        uint64
	ExpectedHeadRevisionDigest string
	Candidate                  AcceptedRevision
}
