package metadata

import (
	"context"
	"testing"

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

func TestMetadataCacheInvalidationHookRunsOnCacheInvalidation(t *testing.T) {
	service := NewMetadataService(nil, nil, nil)
	calls := 0
	service.RegisterCacheInvalidationHook(func() {
		calls++
	})

	service.InvalidateCache()
	if calls != 1 {
		t.Fatalf("hook calls after InvalidateCache = %d; want 1", calls)
	}

	service.invalidateCacheLocked()
	if calls != 2 {
		t.Fatalf("hook calls after invalidateCacheLocked = %d; want 2", calls)
	}
}

func TestMetadataRefreshCacheClearsTriggerSubscriptionRuntimeAndRunsHooks(t *testing.T) {
	service := NewMetadataService(&validationTestMetadataRepo{
		schemas: []*models.ObjectMetadata{{APIName: "Account"}},
	}, nil, nil)
	service.triggerSubscriptionRuntime.lists = map[string][]triggersub.Row{
		"001\x00RecordBeforeSave\x00Create": {{Id: "tsub-001"}},
	}
	service.triggerSubscriptionRuntime.hasAny = map[string]bool{
		"001": true,
	}

	calls := 0
	service.RegisterCacheInvalidationHook(func() {
		calls++
	})

	if err := service.RefreshCache(context.Background()); err != nil {
		t.Fatalf("RefreshCache() error = %v", err)
	}
	if calls != 1 {
		t.Fatalf("hook calls after RefreshCache = %d; want 1", calls)
	}
	if service.triggerSubscriptionRuntime.lists != nil {
		t.Fatalf("triggerSubscriptionRuntime.lists = %#v; want nil after RefreshCache", service.triggerSubscriptionRuntime.lists)
	}
	if service.triggerSubscriptionRuntime.hasAny != nil {
		t.Fatalf("triggerSubscriptionRuntime.hasAny = %#v; want nil after RefreshCache", service.triggerSubscriptionRuntime.hasAny)
	}
}
