package agent

import (
	"context"
	"testing"

	"github.com/stretchr/testify/require"

	"github.com/tidbcloud/AgentTeam/internal/core/domain"
	"github.com/tidbcloud/AgentTeam/internal/store/taskboard"
)

type recordingTaskboardDetailClient struct {
	*taskboard.Store
	request taskboard.GetTaskDetailRequest
}

func (client *recordingTaskboardDetailClient) GetTaskDetail(_ context.Context, request taskboard.GetTaskDetailRequest) (taskboard.GetTaskDetailResponse, error) {
	client.request = request
	return taskboard.GetTaskDetailResponse{
		Detail: taskboard.TaskDetail{
			Task: taskboard.Task{ID: "tsk_1", TaskNumber: 1, Title: "Detail"},
		},
	}, nil
}

func TestTaskBoardServiceAdapterGetTaskDetailSkipsDiscussionReactions(t *testing.T) {
	base := &recordingTaskboardDetailClient{}
	adapter := newTaskBoardServiceAdapter(base)

	_, err := adapter.GetTaskDetail(context.Background(), GetTaskDetailRequest{
		Context: NewAgentServiceContext("wsp_1", "agt_00000000000001", "000000000001"),
		Board:   BoardRef{Channel: "#agentteam"},
		Task:    TaskRef{TaskNumber: 1},
	})

	require.NoError(t, err)
	require.True(t, base.request.SkipDiscussionReactions)
}

type recordingTaskboardCreateSubtasksClient struct {
	*taskboard.Store
	request taskboard.CreateSubtasksRequest
}

func (client *recordingTaskboardCreateSubtasksClient) CreateSubtasks(
	_ context.Context,
	request taskboard.CreateSubtasksRequest,
) (taskboard.CreateSubtasksResponse, error) {
	client.request = request
	return taskboard.CreateSubtasksResponse{ChannelID: "chn_1"}, nil
}

func TestTaskBoardServiceAdapterForwardsParentScope(t *testing.T) {
	base := &recordingTaskboardCreateSubtasksClient{}
	adapter := newTaskBoardServiceAdapter(base)
	scope := &domain.MessageScopeValue{
		Kind:    domain.MessageScopeKindTask,
		ScopeID: "tsk_parent_scope",
	}

	_, err := adapter.CreateSubtasks(context.Background(), CreateSubtasksRequest{
		Context:         NewAgentServiceContext("wsp_1", "agt_00000000000001", "000000000001"),
		ParentTaskScope: scope,
		SourceChannelID: "chn_1",
		Metadata: &CreateTaskMetadata{
			SourceThreadChannelID:       "thr_1",
			SourceThreadParentChannelID: "chn_1",
			SourceThreadParentMessageID: "msg_1",
			SourceThreadRef:             "#agentteam:abcd1234",
		},
		Titles: []string{"Child"},
	})

	require.NoError(t, err)
	require.Equal(t, scope, base.request.ParentTaskScope)
	require.Equal(t, "chn_1", base.request.SourceChannelID)
	require.Equal(t, "thr_1", base.request.Metadata.SourceThreadChannelID)
	require.Equal(t, "#agentteam:abcd1234", base.request.Metadata.SourceThreadRef)
	require.Equal(t, []string{"Child"}, base.request.Titles)
}
