package records

import (
	"context"
	"fmt"

	appErrors "github.com/nexuscrm/kernel/pkg/errors"
	"github.com/nexuscrm/kernel/pkg/ports"
	"github.com/nexuscrm/kernel/pkg/recordlocks"
)

func requireInitialHistoryBusinessRowPrelocked(ctx context.Context, objectName, recordID string) error {
	if !ports.RequiresInitialHistoryBusinessRowPrelock(ctx, objectName) {
		return nil
	}
	key := recordlocks.ParentKey{ObjectName: objectName, RecordID: recordID}
	scope := recordlocks.ScopeFromContext(ctx)
	if scope != nil && scope.HasAcquired(key) {
		return nil
	}
	return appErrors.NewValidationError(
		"atomicHistoryPrelocks",
		fmt.Sprintf("initial history sequence plan requires a complete business-row prelock set; %s/%s was not prelocked", objectName, recordID),
	)
}

func requireInitialHistoryParentRowsPrelocked(ctx context.Context, keys []recordlocks.ParentKey) error {
	scope := recordlocks.ScopeFromContext(ctx)
	for _, key := range recordlocks.OrderedParentKeys(keys) {
		if !ports.RequiresInitialHistoryBusinessRowPrelock(ctx, key.ObjectName) {
			continue
		}
		if scope != nil && scope.HasAcquired(key) {
			continue
		}
		return appErrors.NewValidationError(
			"atomicHistoryPrelocks",
			fmt.Sprintf("initial history sequence plan requires a complete business-row prelock set; %s/%s was not prelocked", key.ObjectName, key.RecordID),
		)
	}
	return nil
}
