package automation

import (
	"context"
	"testing"

	"github.com/nexuscrm/shared/pkg/constants"
	"github.com/nexuscrm/shared/pkg/contract"
)

type connectorRemoteIdentityOwnerDeleteLifecycleStoreStub struct {
	objectName string
	recordID   string
	calls      int
	clearCalls int
}

func (s *connectorRemoteIdentityOwnerDeleteLifecycleStoreStub) ClearConnectorRemoteIdentityOwnerDeletedFenceForRestoredOwnerInAmbientTx(_ context.Context, objectName, recordID string) error {
	s.clearCalls++
	s.objectName = objectName
	s.recordID = recordID
	return nil
}

func (s *connectorRemoteIdentityOwnerDeleteLifecycleStoreStub) QuarantineFinalizedRemoteIdentitiesForDeletedOwnerInAmbientTx(_ context.Context, objectName, recordID string) error {
	s.calls++
	s.objectName = objectName
	s.recordID = recordID
	return nil
}

func TestConnectorRemoteIdentityOwnerDeleteLifecycleHookQuarantinesWithinRecordTransaction(t *testing.T) {
	store := &connectorRemoteIdentityOwnerDeleteLifecycleStoreStub{}
	hook, err := NewConnectorRemoteIdentityOwnerDeleteLifecycleHook(store)
	if err != nil {
		t.Fatalf("NewConnectorRemoteIdentityOwnerDeleteLifecycleHook: %v", err)
	}

	if err := hook(context.Background(), contract.RecordLifecycleEvent{ObjectName: "Lead", RecordID: "00Q-deleted"}); err != nil {
		t.Fatalf("hook: %v", err)
	}
	if store.calls != 1 || store.objectName != "Lead" || store.recordID != "00Q-deleted" {
		t.Fatalf("quarantine call = (%d, %q, %q), want (1, %q, %q)", store.calls, store.objectName, store.recordID, "Lead", "00Q-deleted")
	}
}

func TestConnectorRemoteIdentityOwnerRestoreLifecycleHookClearsOnlyRestoreTransition(t *testing.T) {
	store := &connectorRemoteIdentityOwnerDeleteLifecycleStoreStub{}
	hook, err := NewConnectorRemoteIdentityOwnerRestoreLifecycleHook(store)
	if err != nil {
		t.Fatalf("NewConnectorRemoteIdentityOwnerRestoreLifecycleHook: %v", err)
	}

	ordinaryUpdate := contract.RecordLifecycleEvent{
		ObjectName: "Lead", RecordID: "00Q-restored",
		OldRecord: contract.Record{constants.FieldIsDeleted: false},
		Record:    contract.Record{constants.FieldIsDeleted: false},
	}
	if err := hook(context.Background(), ordinaryUpdate); err != nil {
		t.Fatalf("ordinary update hook: %v", err)
	}
	if store.clearCalls != 0 {
		t.Fatalf("ordinary update clear calls = %d, want 0", store.clearCalls)
	}

	restore := ordinaryUpdate
	restore.OldRecord[constants.FieldIsDeleted] = true
	if err := hook(context.Background(), restore); err != nil {
		t.Fatalf("restore hook: %v", err)
	}
	if store.clearCalls != 1 || store.objectName != "Lead" || store.recordID != "00Q-restored" {
		t.Fatalf("restore clear call = (%d, %q, %q), want (1, %q, %q)", store.clearCalls, store.objectName, store.recordID, "Lead", "00Q-restored")
	}
}
