package taskboard

import (
	"context"
	"testing"

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

type recordingTaskChangeSink struct {
	events []TaskChangeEvent
}

func (sink *recordingTaskChangeSink) HandleTaskChange(_ context.Context, event TaskChangeEvent) {
	sink.events = append(sink.events, event)
}

func TestStoreTaskChangeSinkEmitsCommittedMutationEvents(t *testing.T) {
	t.Parallel()

	sink := &recordingTaskChangeSink{}
	store := NewWithOptions(nil, StoreOptions{TaskChangeSink: sink})
	requestContext := NewUserServiceContext("wsp_1", "usr_1", "alice")

	store.emitTaskCreated(context.Background(), requestContext, "chn_1", []Task{{ID: "tsk_1", ChannelID: "chn_1", TaskNumber: 1}})
	store.emitTaskUpdated(context.Background(), requestContext, Task{ID: "tsk_1", ChannelID: "chn_1", TaskNumber: 1})
	store.emitTaskDeleted(context.Background(), requestContext, "chn_1", "tsk_1")

	require.Len(t, sink.events, 3)
	require.Equal(t, TaskChangeCreated, sink.events[0].EventType)
	require.Equal(t, TaskChangeUpdated, sink.events[1].EventType)
	require.Equal(t, TaskChangeDeleted, sink.events[2].EventType)
	require.Equal(t, "chn_1", sink.events[0].ChannelID)
	require.Equal(t, "tsk_1", sink.events[2].TaskID)
}

func TestStoreTaskChangeSinkSkipsEmptyPayloads(t *testing.T) {
	t.Parallel()

	sink := &recordingTaskChangeSink{}
	store := NewWithOptions(nil, StoreOptions{TaskChangeSink: sink})
	requestContext := NewUserServiceContext("wsp_1", "usr_1", "alice")

	store.emitTaskCreated(context.Background(), requestContext, "chn_1", nil)
	store.emitTaskUpdated(context.Background(), requestContext, Task{})
	store.emitTaskDeleted(context.Background(), requestContext, "chn_1", "")

	require.Empty(t, sink.events)
}
