package service

import (
	"regexp"

	"github.com/asaskevich/govalidator"
	"github.com/pingcap/errors"
)

const (
	genericNameErrMsg = "must be 4~64 characters that can only include numbers, lowercase or uppercase letters, and hyphens, the first and last character must be a letter or number"
)

var (
	// genericFieldRegexp: ASCII Printable characters
	genericFieldRegexp = regexp.MustCompile(`\A[\x20-\x7E]{1,128}\z`)
	genericNameRegexp  = regexp.MustCompile(`^[A-Za-z0-9][-A-Za-z0-9]{2,62}[A-Za-z0-9]$`)
	// phoneNumberRegexp: Only check length and illegal characters
	phoneNumberRegexp = regexp.MustCompile(`\A[-+() 0-9]{1,64}\z`)
)

func IsValidEmail(email string) bool {
	return govalidator.IsEmail(email)
}

func IsValidUsername(firstName, lastName string) error {
	if !genericFieldRegexp.MatchString(firstName) {
		return errors.New("Please enter a valid first name")
	}

	if !genericFieldRegexp.MatchString(lastName) {
		return errors.New("Please enter a valid last name")
	}
	return nil
}

func IsValidOrgName(name string) error {
	if !genericFieldRegexp.MatchString(name) {
		return errors.New("Please enter a valid company name")
	}
	return nil
}

func IsValidClusterName(name string) error {
	if genericNameRegexp.MatchString(name) {
		return nil
	}

	return errors.Errorf("cluster name %s", genericNameErrMsg)
}

func IsValidPhoneNumber(phoneNumber string) error {
	if !phoneNumberRegexp.MatchString(phoneNumber) {
		return errors.New("Please enter a valid phone number")
	}
	return nil
}
