package taskboard

import (
	"context"
	"strings"
	"testing"
	"time"

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

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

	now := time.Date(2026, 6, 7, 16, 20, 0, 0, time.UTC)
	execer := &scriptedTaskboardQueryExecer{}

	err := replaceTaskChecklist(context.Background(), execer, "tsk_checklist_batch", taskChecklistKindReviewChecklist, []TaskChecklistItem{
		{Text: "Review the query plan", Checked: true},
		{Text: "Attach regression evidence"},
	}, now)

	require.NoError(t, err)
	require.Len(t, execer.queries, 2)
	require.Contains(t, execer.queries[0], "DELETE FROM task_checklist_items")
	insertQuery := strings.Join(strings.Fields(execer.queries[1]), " ")
	require.Contains(t, insertQuery, "INSERT INTO task_checklist_items")
	require.Contains(t, insertQuery, "UNION ALL")
	require.Len(t, execer.args[1], 14)
	requireChecklistInsertArgRow(t, execer.args[1], 0, "tsk_checklist_batch", taskChecklistKindReviewChecklist, 0, "Review the query plan", true, now)
	requireChecklistInsertArgRow(t, execer.args[1], 7, "tsk_checklist_batch", taskChecklistKindReviewChecklist, 1, "Attach regression evidence", false, now)

	emptyExecer := &scriptedTaskboardQueryExecer{}
	err = replaceTaskChecklist(context.Background(), emptyExecer, "tsk_checklist_empty", taskChecklistKindAcceptanceCriteria, nil, now)
	require.NoError(t, err)
	require.Len(t, emptyExecer.queries, 1)
	require.Contains(t, emptyExecer.queries[0], "DELETE FROM task_checklist_items")
}

func requireChecklistInsertArgRow(
	t *testing.T,
	args []any,
	offset int,
	taskID string,
	listKind string,
	position int,
	text string,
	checked bool,
	now time.Time,
) {
	t.Helper()

	itemID, ok := args[offset].(string)
	require.True(t, ok)
	require.True(t, strings.HasPrefix(itemID, "tci_"))
	require.Equal(t, taskID, args[offset+1])
	require.Equal(t, listKind, args[offset+2])
	require.Equal(t, position, args[offset+3])
	require.Equal(t, text, args[offset+4])
	require.Equal(t, checked, args[offset+5])
	require.Equal(t, now, args[offset+6])
}
