package taskboard

import (
	"context"
	"fmt"
	"strings"
	"testing"

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

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

	store := TxStore{}
	ctx := context.Background()
	userContext := NewUserServiceContext("wsp_1", "usr_1", "alice")

	_, err := store.BlockTask(ctx, BlockTaskRequest{
		Context: userContext,
		Task:    TaskRef{TaskID: "tsk_1"},
		Block:   TaskBlockInput{Reason: strings.Repeat("x", taskMutationMaxShortStringRunes+1)},
	})
	require.ErrorContains(t, err, fmt.Sprintf("reason must be at most %d characters", taskMutationMaxShortStringRunes))

	_, err = store.AddTaskCheckpoint(ctx, AddTaskCheckpointRequest{
		Context:    userContext,
		Task:       TaskRef{TaskID: "tsk_1"},
		Checkpoint: TaskCheckpointInput{Text: strings.Repeat("x", taskMutationMaxChecklistTextRunes+1)},
	})
	require.ErrorContains(t, err, fmt.Sprintf("checkpoint text must be at most %d characters", taskMutationMaxChecklistTextRunes))

	titles := make([]string, 0, taskMutationMaxCreateItems+1)
	for index := 0; index < taskMutationMaxCreateItems+1; index++ {
		titles = append(titles, fmt.Sprintf("subtask %d", index))
	}
	_, err = store.CreateSubtasks(ctx, CreateSubtasksRequest{
		Context: userContext,
		Task:    TaskRef{TaskID: "tsk_1"},
		Titles:  titles,
	})
	require.ErrorContains(t, err, fmt.Sprintf("tasks must contain at most %d items", taskMutationMaxCreateItems))

	_, err = store.ApproveTaskReview(ctx, ApproveTaskReviewRequest{
		Context: userContext,
		Task:    TaskRef{TaskID: "tsk_1"},
		Review: TaskReviewDecisionInput{
			ReviewID: "trv_1",
			Decision: strings.Repeat("x", taskMutationMaxReviewSummaryRunes+1),
		},
	})
	require.ErrorContains(t, err, fmt.Sprintf("decision must be at most %d characters", taskMutationMaxReviewSummaryRunes))

	questions := make([]string, 0, taskMutationMaxReviewQuestions+1)
	for index := 0; index < taskMutationMaxReviewQuestions+1; index++ {
		questions = append(questions, fmt.Sprintf("question %d", index))
	}
	_, err = store.RequestTaskChanges(ctx, RequestTaskChangesRequest{
		Context: userContext,
		Task:    TaskRef{TaskID: "tsk_1"},
		Review: TaskReviewDecisionInput{
			ReviewID:  "trv_1",
			Questions: questions,
		},
	})
	require.ErrorContains(t, err, fmt.Sprintf("questions must contain at most %d items", taskMutationMaxReviewQuestions))
}
