package source

import (
	"testing"

	"github.com/stretchr/testify/assert"
)

func TestMetricsProvider_ackMsgInAdd(t *testing.T) {
	t.Run("increments counter for valid provider", func(t *testing.T) {
		provider := newMetricsProvider("test-queue")
		mp := provider.(*workqueueMetricsProvider)

		assert.NotNil(t, mp)
		assert.NotNil(t, mp.ackMsgInAddCounter)

		// Should not panic
		mp.ackMsgInAdd()
	})

	t.Run("handles nil provider gracefully", func(t *testing.T) {
		var provider *workqueueMetricsProvider

		// Should not panic
		provider.ackMsgInAdd()
	})
}

func TestMetricsProvider_ackMsgInDone(t *testing.T) {
	t.Run("increments counter for valid provider", func(t *testing.T) {
		provider := newMetricsProvider("test-queue")
		mp := provider.(*workqueueMetricsProvider)

		assert.NotNil(t, mp)
		assert.NotNil(t, mp.ackMsgInDoneCounter)

		// Should not panic
		mp.ackMsgInDone()
	})

	t.Run("handles nil provider gracefully", func(t *testing.T) {
		var provider *workqueueMetricsProvider

		// Should not panic
		provider.ackMsgInDone()
	})
}

func TestNewMetricsProvider(t *testing.T) {
	t.Run("creates provider with name", func(t *testing.T) {
		provider := newMetricsProvider("test-queue")

		assert.NotNil(t, provider)

		mp, ok := provider.(*workqueueMetricsProvider)
		assert.True(t, ok)
		assert.NotNil(t, mp.ackMsgInAddCounter)
		assert.NotNil(t, mp.ackMsgInDoneCounter)
	})

	t.Run("returns nil provider for empty name", func(t *testing.T) {
		provider := newMetricsProvider("")

		// Should return a nil pointer wrapped in interface
		assert.Nil(t, provider)
	})

	t.Run("creates providers with different names", func(t *testing.T) {
		provider1 := newMetricsProvider("queue-1")
		provider2 := newMetricsProvider("queue-2")

		assert.NotNil(t, provider1)
		assert.NotNil(t, provider2)

		mp1 := provider1.(*workqueueMetricsProvider)
		mp2 := provider2.(*workqueueMetricsProvider)

		// Both should have their own counters
		assert.NotNil(t, mp1.ackMsgInAddCounter)
		assert.NotNil(t, mp2.ackMsgInAddCounter)
	})
}

func TestMetricsProvider_Integration(t *testing.T) {
	t.Run("metrics work with workqueue", func(t *testing.T) {
		provider := newMetricsProvider("integration-test")
		mp := provider.(*workqueueMetricsProvider)

		// Simulate workqueue operations
		mp.ackMsgInAdd()
		mp.ackMsgInAdd()
		mp.ackMsgInDone()

		// Should not panic and counters should be incremented
		assert.NotNil(t, mp)
	})
}
