package recordoverlay

import (
	"context"

	"github.com/nexuscrm/shared/pkg/models"
)

type ctxKey struct{}

// WithRecords installs a read-only overlay of accumulated record images for
// preview-time reads that must observe in-memory mutations before they commit.
func WithRecords(ctx context.Context, records map[string]models.SObject) context.Context {
	if len(records) == 0 {
		return ctx
	}
	cloned := make(map[string]models.SObject, len(records))
	for key, record := range records {
		cloned[key] = cloneSObject(record)
	}
	return context.WithValue(ctx, ctxKey{}, cloned)
}

// Lookup resolves one overlaid record by the canonical "Object/Id" key.
func Lookup(ctx context.Context, objectAPIName, recordID string) (models.SObject, bool) {
	if ctx == nil {
		return nil, false
	}
	records, _ := ctx.Value(ctxKey{}).(map[string]models.SObject)
	if len(records) == 0 {
		return nil, false
	}
	record, ok := records[objectAPIName+"/"+recordID]
	if !ok || record == nil {
		return nil, false
	}
	return cloneSObject(record), true
}

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