package channel

import (
	"testing"
	"time"

	"github.com/stretchr/testify/require"

	"github.com/tidbcloud/AgentTeam/internal/store/channel"
	"github.com/tidbcloud/AgentTeam/internal/store/message"
)

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

	pinnedAt := time.Date(2026, 7, 4, 15, 0, 0, 0, time.UTC)
	response := channelResponseFromSummary(message.ChannelSummary{
		ChannelID:         "chn_1",
		Slug:              "channel-abc12345",
		DisplayName:       "中文 频道",
		Description:       "localized channel",
		Visibility:        "private",
		Tutorial:          true,
		Joined:            true,
		CanInvite:         true,
		CanManage:         true,
		SubscriptionState: "mute",
		PinnedAt:          &pinnedAt,
	})

	require.Equal(t, "chn_1", response.ID)
	require.Equal(t, "channel-abc12345", response.Name)
	require.Equal(t, "channel-abc12345", response.Slug)
	require.Equal(t, "中文 频道", response.DisplayName)
	require.Equal(t, "localized channel", response.Description)
	require.Equal(t, "private", response.Visibility)
	require.True(t, response.Tutorial)
	require.Equal(t, "mute", response.SubscriptionState)
	require.Equal(t, &pinnedAt, response.PinnedAt)
}

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

	response := discoverChannelResponseFromStore(channel.DiscoverableChannel{
		ChannelID:   "chn_1",
		Slug:        "channel-abc12345",
		DisplayName: "中文 频道",
		Description: "localized channel",
		Visibility:  "public",
	})

	require.Equal(t, "chn_1", response.ID)
	require.Equal(t, "channel-abc12345", response.Name)
	require.Equal(t, "channel-abc12345", response.Slug)
	require.Equal(t, "中文 频道", response.DisplayName)
	require.Equal(t, "localized channel", response.Description)
	require.Equal(t, "public", response.Visibility)
}

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

	response := channelAccessResponseFromResolution(channel.ChannelAccessResolution{
		Status: channel.ChannelAccessStatusJoined,
		Channel: message.ChannelSummary{
			ChannelID:   "chn_public",
			Slug:        "public-room",
			DisplayName: "Public Room",
			Description: "Public channel",
			Visibility:  "public",
			Joined:      true,
		},
	})

	require.Equal(t, channel.ChannelAccessStatusJoined, response.Status)
	require.NotNil(t, response.Channel)
	require.Equal(t, "public", response.Channel.Visibility)
}
