package userbehavior

import (
	"github.com/go-logr/logr"
	. "github.com/onsi/ginkgo/v2"
	. "github.com/onsi/gomega"
	evbus "github.com/tidbcloud/eventbus-datastruct/event"
	mgmtevent "github.com/tidbcloud/tidb-management-service/utilities/clusterevent"
)

var _ = Describe("eventbus handlers", func() {
	Describe("HandleDBaaSClusterEvent", func() {
		var s *svc

		BeforeEach(func() {
			s = &svc{
				logger: logr.Discard(),
				ubCh:   make(chan UBEvent, 1),
			}
		})

		It("skips starter cluster events", func() {
			err := s.HandleDBaaSClusterEvent("uuid", &mgmtevent.ClusterEvent{
				EventType:   mgmtevent.EventTypeScaling,
				ServicePlan: "Starter",
			})

			Expect(err).ToNot(HaveOccurred())
			Expect(s.ubCh).ToNot(Receive())
		})

		It("enqueues accepted non-starter cluster events", func() {
			err := s.HandleDBaaSClusterEvent("uuid", &mgmtevent.ClusterEvent{
				EventType:   mgmtevent.EventTypeScaling,
				ServicePlan: "Dedicated",
			})

			Expect(err).ToNot(HaveOccurred())
			Expect(s.ubCh).To(Receive())
		})
	})

	Describe("HandleDBaaSDisplayEvent", func() {
		var s *svc

		BeforeEach(func() {
			s = &svc{
				logger: logr.Discard(),
				ubCh:   make(chan UBEvent, 2),
			}
		})

		It("enqueues import and startup import events when ImportData fails", func() {
			err := s.HandleDBaaSDisplayEvent("uuid", &evbus.DisplayEvent{
				DisplayEventType: DisplayEventTypeImport,
				DisplayStatus:    evbus.EventStatusFailed,
			})

			Expect(err).ToNot(HaveOccurred())
			Expect(s.ubCh).To(Receive(BeAssignableToTypeOf(&importUBEvent{})))
			Expect(s.ubCh).To(Receive(BeAssignableToTypeOf(&startupImportUBEvent{})))
		})
	})
})
