package layoutauthoringv1

type ChangeMode string

const (
	ChangePreserve ChangeMode = "PRESERVE"
	ChangeSet      ChangeMode = "SET"
	ChangeClear    ChangeMode = "CLEAR"
)

func (mode ChangeMode) Valid() bool {
	return mode == ChangePreserve || mode == ChangeSet || mode == ChangeClear
}

// Change supplies explicit presence. PRESERVE and CLEAR require nil Value;
// SET requires a non-nil Value, including a pointer to an empty collection.
type Change[T any] struct {
	Mode  ChangeMode `json:"mode"`
	Value *T         `json:"value,omitempty"`
}

type LayoutDocumentChanges struct {
	Name                 Change[string]            `json:"name"`
	Kind                 Change[string]            `json:"kind"`
	LayoutVersion        Change[uint32]            `json:"layout_version"`
	CompactFields        Change[[]string]          `json:"compact_fields"`
	Tabs                 Change[[]string]          `json:"tabs"`
	Sections             Change[[]LayoutSection]   `json:"sections"`
	RelatedLists         Change[[]RelatedList]     `json:"related_lists"`
	RecordPanels         Change[[]RecordPanel]     `json:"record_panels"`
	HeaderActions        Change[ActionPlacement]   `json:"header_actions"`
	QuickActions         Change[ActionPlacement]   `json:"quick_actions"`
	RecordStates         Change[[]RecordStateRule] `json:"record_states"`
	PrimaryHeaderActions Change[[]string]          `json:"primary_header_actions"`
}

type FieldIDListChange = Change[[]string]
