package models

// PreparedRecordUpdate captures the post-before-save record image and the
// logical diff that a shared update pipeline should resume from.
type PreparedRecordUpdate struct {
	Record           SObject
	EffectiveUpdates SObject
	InternalUpdates  SObject
}

func (p *PreparedRecordUpdate) Clone() *PreparedRecordUpdate {
	if p == nil {
		return nil
	}
	return &PreparedRecordUpdate{
		Record:           clonePreparedRecordUpdateSObject(p.Record),
		EffectiveUpdates: clonePreparedRecordUpdateSObject(p.EffectiveUpdates),
		InternalUpdates:  clonePreparedRecordUpdateSObject(p.InternalUpdates),
	}
}

func clonePreparedRecordUpdateSObject(in SObject) SObject {
	if in == nil {
		return nil
	}
	out := make(SObject, len(in))
	for k, v := range in {
		out[k] = v
	}
	return out
}
