package integrationtests

import (
	"testing"

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

func TestSharing(t *testing.T) {
	th := SetupTestHelper(t).InitBasic()
	defer th.TearDown()

	var boardID string
	token := utils.NewID(utils.IDTypeToken)

	t.Run("an unauthenticated client should not be able to get a sharing", func(t *testing.T) {
		th.Logout(th.Client)

		sharing, resp := th.Client.GetSharing("board-id")
		th.CheckUnauthorized(resp)
		require.Nil(t, sharing)
	})

	t.Run("Check no initial sharing", func(t *testing.T) {
		th.Login1()

		teamID := "0"
		newBoard := &model.Board{
			TeamID: teamID,
			Type:   model.BoardTypeOpen,
		}

		board, err := th.Server.App().CreateBoard(newBoard, th.GetUser1().ID, true)
		require.NoError(t, err)
		require.NotNil(t, board)
		boardID = board.ID

		s, err := th.Server.App().GetSharing(boardID)
		require.Error(t, err)
		require.True(t, model.IsErrNotFound(err))
		require.Nil(t, s)

		sharing, resp := th.Client.GetSharing(boardID)
		th.CheckNotFound(resp)
		require.Nil(t, sharing)
	})

	t.Run("POST sharing, config = false", func(t *testing.T) {
		sharing := model.Sharing{
			ID:       boardID,
			Token:    token,
			Enabled:  true,
			UpdateAt: 1,
		}

		// it will fail with default config
		success, resp := th.Client.PostSharing(&sharing)
		require.False(t, success)
		require.Error(t, resp.Error)

		t.Run("GET sharing", func(t *testing.T) {
			sharing, resp := th.Client.GetSharing(boardID)
			// Expect empty sharing object
			th.CheckNotFound(resp)
			require.Nil(t, sharing)
		})
	})

	t.Run("POST sharing, config = true", func(t *testing.T) {
		th.Server.Config().EnablePublicSharedBoards = true
		sharing := model.Sharing{
			ID:       boardID,
			Token:    token,
			Enabled:  true,
			UpdateAt: 1,
		}

		// it will succeed with updated config
		success, resp := th.Client.PostSharing(&sharing)
		require.True(t, success)
		require.NoError(t, resp.Error)

		t.Run("GET sharing", func(t *testing.T) {
			sharing, resp := th.Client.GetSharing(boardID)
			require.NoError(t, resp.Error)
			require.NotNil(t, sharing)
			require.Equal(t, sharing.ID, boardID)
			require.True(t, sharing.Enabled)
			require.Equal(t, sharing.Token, token)
		})
	})
}