package event_bus

import (
	"testing"

	"github.com/onsi/gomega"

	"github.com/pingcap/errors"
)

type TestEvent struct{}

func (te TestEvent) Name() string {
	return "TestEvent"
}

type TestErrorSubscriber struct{}

func (ts TestErrorSubscriber) SubscribeWithError(e TestEvent) error {
	return errors.New(e.Name())
}

func TestSubscriberWithErr(t *testing.T) {
	Register(&TestErrorSubscriber{})

	err := PostSync(TestEvent{})

	g := gomega.NewGomegaWithT(t)
	g.Expect(err).To(gomega.MatchError("TestEvent"))
}

type TestEvent1 struct{}

func (te1 TestEvent1) Name() string {
	return "TestEvent1"
}

type TestNormal1Subscriber struct {
	testEvent int

	testEvent1 int
}

func (tn *TestNormal1Subscriber) SubscribeTestEvent(e TestEvent) {
	tn.testEvent++
}

func (tn *TestNormal1Subscriber) SubscribeTestEvent1(e TestEvent1) {
	tn.testEvent1++
}

type TestNormal2Subscriber struct {
	testEvent int

	testEvent1 int
}

func (tn *TestNormal2Subscriber) SubscribeTestEvent(e TestEvent) {
	tn.testEvent++
}

func (tn *TestNormal2Subscriber) SubscribeTestEvent1(e TestEvent1) {
	tn.testEvent1++
}

func TestSubscriberWithNormal(t *testing.T) {
	g := gomega.NewGomegaWithT(t)

	t1 := TestNormal1Subscriber{
		testEvent:  0,
		testEvent1: 100,
	}
	Register(&t1)

	t2 := TestNormal2Subscriber{
		testEvent:  1000,
		testEvent1: 2000,
	}
	Register(&t2)

	_ = PostSync(TestEvent{})

	g.Expect(t1.testEvent).To(gomega.Equal(1))
	g.Expect(t2.testEvent).To(gomega.Equal(1001))
	// assert.Equal(t1.testEvent, 1)
	// assert.Equal(t2.testEvent, 1001)

	err := PostSync(TestEvent1{})
	g.Expect(err).To(gomega.Succeed())
	// assert.Nil(err)
	// assert.Equal(t1.testEvent, 1)
	// assert.Equal(t2.testEvent, 1001)

	g.Expect(t1.testEvent).To(gomega.Equal(1))
	g.Expect(t2.testEvent).To(gomega.Equal(1001))

	// assert.Equal(t1.testEvent1, 101)
	// assert.Equal(t2.testEvent1, 2001)

	g.Expect(t1.testEvent1).To(gomega.Equal(101))
	g.Expect(t2.testEvent1).To(gomega.Equal(2001))
}
