package integrationtests

import (
	"testing"

	"github.com/mattermost/focalboard/server/model"
	"github.com/stretchr/testify/require"
)

func TestSidebar(t *testing.T) {
	th := SetupTestHelperWithToken(t).Start()
	defer th.TearDown()

	// we'll create a new board.
	// The board should end up in a default "Boards" category
	board := th.CreateBoard("team-id", "O")

	categoryBoards := th.GetUserCategoryBoards("team-id")
	require.Equal(t, 1, len(categoryBoards))
	require.Equal(t, "Boards", categoryBoards[0].Name)
	require.Equal(t, 1, len(categoryBoards[0].BoardMetadata))
	require.Equal(t, board.ID, categoryBoards[0].BoardMetadata[0].BoardID)

	// create a new category, a new board
	// and move that board into the new category
	board2 := th.CreateBoard("team-id", "O")
	category := th.CreateCategory(model.Category{
		Name:   "Category 2",
		TeamID: "team-id",
		UserID: "single-user",
	})
	th.UpdateCategoryBoard("team-id", category.ID, board2.ID)

	categoryBoards = th.GetUserCategoryBoards("team-id")
	// now there should be two categories - boards and the one
	// we created just now
	require.Equal(t, 2, len(categoryBoards))

	// the newly created category should be the first one array
	// as new categories end up on top in LHS
	require.Equal(t, "Category 2", categoryBoards[0].Name)
	require.Equal(t, 1, len(categoryBoards[0].BoardMetadata))
	require.Equal(t, board2.ID, categoryBoards[0].BoardMetadata[0].BoardID)

	// now we'll delete the custom category we created, "Category 2"
	// and all it's boards should get moved to the Boards category
	th.DeleteCategory("team-id", category.ID)
	categoryBoards = th.GetUserCategoryBoards("team-id")
	require.Equal(t, 1, len(categoryBoards))
	require.Equal(t, "Boards", categoryBoards[0].Name)
	require.Equal(t, 2, len(categoryBoards[0].BoardMetadata))
	require.Contains(t, categoryBoards[0].BoardMetadata, model.CategoryBoardMetadata{BoardID: board.ID, Hidden: false})
	require.Contains(t, categoryBoards[0].BoardMetadata, model.CategoryBoardMetadata{BoardID: board2.ID, Hidden: false})
}

func TestHideUnhideBoard(t *testing.T) {
	th := SetupTestHelperWithToken(t).Start()
	defer th.TearDown()

	// we'll create a new board.
	// The board should end up in a default "Boards" category
	th.CreateBoard("team-id", "O")

	// the created board should not be hidden
	categoryBoards := th.GetUserCategoryBoards("team-id")
	require.Equal(t, 1, len(categoryBoards))
	require.Equal(t, "Boards", categoryBoards[0].Name)
	require.Equal(t, 1, len(categoryBoards[0].BoardMetadata))
	require.False(t, categoryBoards[0].BoardMetadata[0].Hidden)

	// now we'll hide the board
	response := th.Client.HideBoard("team-id", categoryBoards[0].ID, categoryBoards[0].BoardMetadata[0].BoardID)
	th.CheckOK(response)

	// verifying if the board has been marked as hidden
	categoryBoards = th.GetUserCategoryBoards("team-id")
	require.True(t, categoryBoards[0].BoardMetadata[0].Hidden)

	// trying to hide the already hidden board.This should have no effect
	response = th.Client.HideBoard("team-id", categoryBoards[0].ID, categoryBoards[0].BoardMetadata[0].BoardID)
	th.CheckOK(response)
	categoryBoards = th.GetUserCategoryBoards("team-id")
	require.True(t, categoryBoards[0].BoardMetadata[0].Hidden)

	// now we'll unhide the board
	response = th.Client.UnhideBoard("team-id", categoryBoards[0].ID, categoryBoards[0].BoardMetadata[0].BoardID)
	th.CheckOK(response)

	// verifying
	categoryBoards = th.GetUserCategoryBoards("team-id")
	require.False(t, categoryBoards[0].BoardMetadata[0].Hidden)

	// trying to unhide the already visible board.This should have no effect
	response = th.Client.UnhideBoard("team-id", categoryBoards[0].ID, categoryBoards[0].BoardMetadata[0].BoardID)
	th.CheckOK(response)
	categoryBoards = th.GetUserCategoryBoards("team-id")
	require.False(t, categoryBoards[0].BoardMetadata[0].Hidden)
}
