package notifier

import (
	"context"
	"testing"

	"github.com/stretchr/testify/require"
	"go.skia.org/infra/go/testutils/unittest"
)

type sentMessage struct {
	subject string
	msg     *Message
}

type testNotifier struct {
	sent []*sentMessage
}

func (n *testNotifier) Send(_ context.Context, subject string, msg *Message) error {
	n.sent = append(n.sent, &sentMessage{
		subject: subject,
		msg:     msg,
	})
	return nil
}

func TestRouter(t *testing.T) {
	unittest.SmallTest(t)

	m := NewRouter(nil, nil, nil)
	ctx := context.Background()

	n1 := &testNotifier{}
	m.Add(n1, FILTER_DEBUG, nil, "")
	n2 := &testNotifier{}
	m.Add(n2, FILTER_WARNING, nil, "")
	n3 := &testNotifier{}
	m.Add(n3, Filter(0), []string{"whitelisted type"}, "")

	require.NoError(t, m.Send(ctx, &Message{
		Subject:  "Hi!",
		Body:     "Message body",
		Severity: SEVERITY_INFO,
		Type:     "my-msg-type",
	}))

	require.Equal(t, 1, len(n1.sent))
	require.Equal(t, "Hi!", n1.sent[0].subject)
	require.Equal(t, "Message body", n1.sent[0].msg.Body)
	require.Equal(t, 0, len(n2.sent))
	require.Equal(t, 0, len(n3.sent))

	n4 := &testNotifier{}
	m.Add(n4, FILTER_INFO, nil, "One subject to rule them all")

	require.NoError(t, m.Send(ctx, &Message{
		Subject:  "My subject",
		Body:     "Second Message",
		Severity: SEVERITY_ERROR,
		Type:     "whitelisted type",
	}))

	require.Equal(t, 1, len(n4.sent))
	require.Equal(t, "One subject to rule them all", n4.sent[0].subject)
	require.Equal(t, "Second Message", n4.sent[0].msg.Body)
	require.Equal(t, 1, len(n3.sent))
	require.Equal(t, "My subject", n3.sent[0].subject)
	require.Equal(t, "Second Message", n3.sent[0].msg.Body)
}
