package app

import (
	"bytes"
	"context"
	"errors"
	"log/slog"
	"testing"

	"github.com/stretchr/testify/require"

	"github.com/tidbcloud/AgentTeam/internal/api/testkit/httputil"
)

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

	logger := slog.New(slog.NewTextHandler(&bytes.Buffer{}, nil))
	// Should not panic.
	blockServiceEventSubscriptions(context.Background(), nil, logger, "wsp_1", "github", "")
}

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

	blocker := &httputil.FakeBlocker{}
	blockServiceEventSubscriptions(context.Background(), blocker, nil, "wsp_1", "github", "ref")
	require.Len(t, blocker.BlockCalls, 1)
	require.Equal(t, "wsp_1", blocker.BlockCalls[0].WorkspaceID)
	require.Equal(t, "github", blocker.BlockCalls[0].Provider)
	require.Equal(t, "ref", blocker.BlockCalls[0].ConnectionRef)
}

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

	blocker := &httputil.FakeBlocker{BlockErr: errors.New("boom")}
	buffer := &bytes.Buffer{}
	logger := slog.New(slog.NewTextHandler(buffer, nil))

	blockServiceEventSubscriptions(context.Background(), blocker, logger, "wsp_1", "github", "ref")
	require.Contains(t, buffer.String(), "block service event subscriptions")
	require.Contains(t, buffer.String(), "boom")
}

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

	blocker := &httputil.FakeBlocker{BlockErr: errors.New("boom")}
	blockServiceEventSubscriptions(context.Background(), blocker, nil, "wsp_1", "github", "ref")
	require.Len(t, blocker.BlockCalls, 1)
}
