package notifier

import (
	"context"
	"testing"

	"github.com/stretchr/testify/require"
	"go.skia.org/infra/email/go/emailclient"
)

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) {

	m := NewRouter(nil, emailclient.New(), 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{"included 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:     "included 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)
}
