package taskboard

import (
	"context"
	"database/sql"
	"testing"
	"time"

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

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

	now := time.Date(2026, 6, 14, 9, 0, 0, 0, time.UTC)
	execer := &scriptedTaskboardQueryExecer{
		execResults: []scriptedTaskboardExecResult{
			{tag: testExecResult{rowsAffected: 0}},
		},
		rowResults: []scriptedTaskboardRowResult{
			{values: []any{1}},
		},
	}

	err := ensureTaskScopeReadMembership(context.Background(), execer, "task_scope_1", "mem_1", 7, 70, now)

	require.NoError(t, err)
	require.Len(t, execer.queries, 2)
	require.Contains(t, execer.queries[0], "UPDATE scope_memberships")
	require.Contains(t, execer.queries[0], "updated_at = CASE")
	require.Contains(t, execer.queries[0], "last_read_seq < $3")
	require.Contains(t, execer.queries[0], "last_read_global_seq < $4")
	require.Contains(t, execer.queries[1], "SELECT 1")
	require.NotContains(t, execer.queries[1], "INSERT INTO scope_memberships")
}

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

	now := time.Date(2026, 6, 14, 9, 5, 0, 0, time.UTC)
	execer := &scriptedTaskboardQueryExecer{
		execResults: []scriptedTaskboardExecResult{
			{tag: testExecResult{rowsAffected: 0}},
			{tag: testExecResult{rowsAffected: 1}},
		},
		rowResults: []scriptedTaskboardRowResult{
			{err: sql.ErrNoRows},
		},
	}

	err := ensureTaskScopeReadMembership(context.Background(), execer, "task_scope_1", "mem_1", 7, 70, now)

	require.NoError(t, err)
	require.Len(t, execer.queries, 3)
	require.Contains(t, execer.queries[2], "INSERT INTO scope_memberships")
	require.Contains(t, execer.queries[2], "updated_at = CASE")
	require.Contains(t, execer.queries[2], "ELSE scope_memberships.updated_at")
}
