package channel

import (
	"net/http"
	"testing"

	"github.com/gin-gonic/gin"
	"github.com/stretchr/testify/require"

	"github.com/tidbcloud/AgentTeam/internal/api/dto"
)

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

	store := &channelHandlerTestStore{}
	realtime := &channelHandlerTestRealtime{}
	handler := &ChannelCRUDHandler{channels: store, appStore: store, realtime: realtime}

	listResponse, err := handler.List(channelWorkspaceRequest())
	require.NoError(t, err)
	require.Equal(t, http.StatusOK, listResponse.Status)
	require.Equal(t, "usr_1", store.listChannelsUserID)
	require.Equal(t, "wsp_1", store.listChannelsWorkspaceID)
	require.Equal(t, []dto.ChannelResponse{{ID: "chn_1", Name: "general", Slug: "general", Description: "General", Visibility: "private", Joined: true, CanInvite: true, CanManage: true}}, listResponse.Body)

	createResponse, err := handler.Create(channelWorkspaceJSON(dto.ChannelCreateRequest{Name: " general "}))
	require.NoError(t, err)
	require.Equal(t, "general", store.created.name)
	require.Equal(t, []string{"wsp_1"}, realtime.updated)
	require.Equal(t, "chn_new", createResponse.Body.(dto.ChannelResponse).ID)

	name := "renamed"
	description := "updated"
	visibility := "public"
	updateResponse, err := handler.Update(channelWorkspaceJSONWithParams(dto.ChannelUpdateRequest{Name: &name, Description: &description, Visibility: &visibility}, gin.Param{Key: "channelId", Value: " chn_1 "}))
	require.NoError(t, err)
	require.Equal(t, "chn_1", store.updated.channelID)
	require.Same(t, &name, store.updated.name)
	require.Same(t, &description, store.updated.description)
	require.Same(t, &visibility, store.updated.visibility)
	require.Equal(t, "renamed", updateResponse.Body.(dto.ChannelResponse).Name)

	deleteResponse, err := handler.Delete(channelWorkspaceRequest(gin.Param{Key: "channelId", Value: " chn_1 "}))
	require.NoError(t, err)
	require.Equal(t, "chn_1", store.deleted.channelID)
	require.Equal(t, dto.EmptyResponse{}, deleteResponse.Body)
	require.Equal(t, []string{"wsp_1", "wsp_1", "wsp_1"}, realtime.updated)
}
