package tenant

import (
	"testing"

	"github.com/pingcap/dbaas/central/db/entity"
	"github.com/pingcap/dbaas/central/model/tenant"
	"github.com/pingcap/dbaas/central/model/tenant/handler"
	"github.com/stretchr/testify/assert"
	"github.com/tidbcloud/idl/pbgen/proto/central"
)

const (
	role1 = entity.UserRole("owner")
	role2 = entity.UserRole("member")
	role3 = entity.UserRole("billing_admin")
	role4 = entity.UserRole("admin")
)

func TestIsValidUserRole(t *testing.T) {
	assert.Nil(t, IsValidUserRole(role1))
	assert.Nil(t, IsValidUserRole(role2))
	assert.Nil(t, IsValidUserRole(role3))
	assert.NotNil(t, IsValidUserRole(role4))
}

func TestValidateInviteUserReq(t *testing.T) {
	emailList1 := []string{"a@pingcap.com"}
	emailList2 := []string{"a@pingcap.com", "b@pingcap.com"}
	emailList3 := []string{"a", "a@pingcap.com"}
	req1 := tenant.InviteUserReq{
		OrgID:     1,
		ProjectID: 1,
		EmailList: emailList1,
		Role:      role1,
	}
	req2 := tenant.InviteUserReq{
		OrgID:     1,
		ProjectID: 1,
		EmailList: emailList2,
		Role:      role1,
	}
	req3 := tenant.InviteUserReq{
		OrgID:     1,
		ProjectID: 1,
		EmailList: emailList3,
		Role:      role1,
	}
	req4 := tenant.InviteUserReq{
		OrgID:     1,
		ProjectID: 1,
		EmailList: emailList1,
		Role:      role4,
	}

	assert.Nil(t, validateInviteUserReq(req1))
	assert.Nil(t, validateInviteUserReq(req2))
	assert.NotNil(t, validateInviteUserReq(req3))
	assert.NotNil(t, validateInviteUserReq(req4))
}

func TestValidateRegisterWithThirdParty(t *testing.T) {
	req := &central.RegistrationReq{
		FirstName:                 "test",
		LastName:                  "user",
		Company:                   "pingcap",
		Email:                     "test@pingcap.com",
		Job:                       "Engineer",
		PhoneNumber:               "123456789",
		Password:                  "test_password",
		Country:                   "CN",
		AcceptService:             true,
		RecaptchaResponse:         "recaptcha_response",
		ThirdPartyAccountProvider: handler.AWSAccountProvider,
		ThirdPartyAccountToken:    "abc",
	}
	assert.Nil(t, validateRegistrationReq(req, false))

	req1 := &central.RegistrationReq{
		FirstName:                 "test",
		LastName:                  "user",
		Company:                   "pingcap",
		Email:                     "test@pingcap.com",
		Job:                       "Engineer",
		PhoneNumber:               "123456789",
		Password:                  "test_password",
		Country:                   "CN",
		AcceptService:             true,
		RecaptchaResponse:         "recaptcha_response",
		ThirdPartyAccountProvider: handler.AWSAccountProvider,
	}
	assert.NotNil(t, validateRegistrationReq(req1, false))
}
