package persistence

import (
	"context"
	"database/sql"
	"errors"
	"strings"
	"testing"

	database "github.com/nexuscrm/db"
	apperrors "github.com/nexuscrm/kernel/pkg/errors"
	"github.com/nexuscrm/shared/pkg/constants"
)

func managedRowCascadeTestTarget(parentID string) managedRowCascadeDeleteTarget {
	return managedRowCascadeDeleteTarget{
		tableName:  constants.TableObject,
		parentKeys: []string{parentID},
	}
}

func runManagedRowCascadePreflight(
	t *testing.T,
	db *sql.DB,
	target managedRowCascadeDeleteTarget,
) error {
	t.Helper()
	transactions := NewTransactionManager(database.NewConnectionFromDB(db))
	return transactions.WithPessimisticTransaction(
		t.Context(),
		func(ctx context.Context) error {
			return preflightManagedRowMutationCascades(ctx, transactions, target)
		},
	)
}

func TestManagedRowMutationCascadePreflightRequiresOwnedTransaction(t *testing.T) {
	err := preflightManagedRowMutationCascades(
		t.Context(),
		nil,
		managedRowCascadeTestTarget("obj-widget"),
	)
	var internal *apperrors.InternalError
	if !errors.As(err, &internal) {
		t.Fatalf("error = %T %v, want InternalError", err, err)
	}
	if !strings.Contains(err.Error(), "TransactionManager-owned pessimistic transaction") {
		t.Fatalf("error = %v, want exact pessimistic transaction requirement", err)
	}
}
