package controllers

import (
	"testing"

	"github.com/stretchr/testify/assert"
	"github.com/tidbcloud/pkgv2/util"
)

const (
	smiley = "😄"
)

func TestIsValidUsername(t *testing.T) {
	firstName1 := ""
	firstName2 := "demo"
	firstName3 := util.RandString(130)
	firstName4 := smiley
	lastName1 := ""
	lastName2 := "foo"
	lastName3 := util.RandString(130)
	lastName4 := smiley

	assert.NotNil(t, IsValidUsername(firstName1, lastName1))
	assert.NotNil(t, IsValidUsername(firstName1, lastName2))
	assert.NotNil(t, IsValidUsername(firstName2, lastName1))
	assert.Nil(t, IsValidUsername(firstName2, lastName2))
	assert.NotNil(t, IsValidUsername(firstName2, lastName3))
	assert.NotNil(t, IsValidUsername(firstName3, lastName2))
	assert.NotNil(t, IsValidUsername(firstName3, lastName3))
	assert.NotNil(t, IsValidUsername(firstName4, lastName2))
	assert.NotNil(t, IsValidUsername(firstName2, lastName4))
}

func TestIsValidOrgName(t *testing.T) {
	orgName1 := "PingCAP.com"
	orgName2 := "PingCAP, Inc."
	orgName3 := ""
	orgName4 := util.RandString(130)
	orgName5 := smiley

	assert.Nil(t, IsValidOrgName(orgName1))
	assert.NotNil(t, IsValidOrgName(orgName2))
	assert.NotNil(t, IsValidOrgName(orgName3))
	assert.NotNil(t, IsValidOrgName(orgName4))
	assert.NotNil(t, IsValidOrgName(orgName5))
}

func TestIsValidProjectName(t *testing.T) {
	projectName1 := "PingCAP.com"
	projectName2 := "PingCAP, Inc."
	projectName3 := ""
	projectName4 := util.RandString(130)
	projectName5 := smiley

	assert.Nil(t, IsValidOrgName(projectName1))
	assert.NotNil(t, IsValidOrgName(projectName2))
	assert.NotNil(t, IsValidOrgName(projectName3))
	assert.NotNil(t, IsValidOrgName(projectName4))
	assert.NotNil(t, IsValidOrgName(projectName5))
}

func TestIsValidPhoneNumber(t *testing.T) {
	phoneNumber1 := "+1 (111) 111-1111"
	phoneNumber2 := "abc"
	phoneNumber3 := ""
	phoneNumber4 := util.RandString(70)

	assert.Nil(t, IsValidPhoneNumber(phoneNumber1))
	assert.NotNil(t, IsValidPhoneNumber(phoneNumber2))
	assert.NotNil(t, IsValidPhoneNumber(phoneNumber3))
	assert.NotNil(t, IsValidPhoneNumber(phoneNumber4))
}

func TestIsValidEmail(t *testing.T) {
	email1 := "test@pingcap.com"
	email2 := "test"
	email3 := "test@c0m"
	email4 := "a@snapmail.cc"
	email5 := "a+b.c@snapmail.cc"

	assert.True(t, IsValidEmail(email1))
	assert.False(t, IsValidEmail(email2))
	assert.False(t, IsValidEmail(email3))
	assert.True(t, IsValidEmail(email4))
	assert.True(t, IsValidEmail(email5))
}
