package controllers

import (
	"regexp"

	"github.com/tidbcloud/tiinf/monitor/tilog"

	"github.com/go-playground/validator/v10"
	"github.com/pingcap/errors"
)

const (
	minPasswordLength = 8
	maxPasswordLength = 64
)

var (
	// genericFieldRegexp: ASCII Printable characters
	//genericFieldRegexp = regexp.MustCompile(`\A[\x20-\x7E]{1,128}\z`
	// [a-zA-Z0-9][._-s]
	genericNameRegexp = regexp.MustCompile(`^([a-zA-Z0-9_-]|'|\.|\s){1,64}$`)
	// phoneNumberRegexp: Only check length and illegal characters
	phoneNumberRegexp = regexp.MustCompile(`\A[-+() 0-9]{1,64}\z`)
)

// use a single instance of Validate, it caches struct info
var validate = validator.New()

func IsValidEmail(email string) bool {
	errs := validate.Var(email, "required,email")
	return errs == nil
}

func IsValidUsername(firstName, lastName string) error {
	//firstName = replaceStr(firstName)
	//lastName = replaceStr(lastName)
	if !genericNameRegexp.MatchString(firstName) {
		tilog.PlainInfo("invalid first name :" + firstName)
		return errors.New("Please enter a valid first name")
	}

	if !genericNameRegexp.MatchString(lastName) {
		tilog.PlainInfo("invalid last name :" + lastName)
		return errors.New("Please enter a valid last name")
	}
	return nil
}

// Auth0 will check password strength
func IsValidUserPassword(password string) error {
	passwordLen := len(password)
	if passwordLen < minPasswordLength || passwordLen > maxPasswordLength {
		return errors.Errorf("Password must be 8-64 characters")
	}
	return nil
}

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

func IsValidProjectName(name string) error {
	if !genericNameRegexp.MatchString(name) {
		return errors.New("Please enter a valid project name")
	}
	return nil
}

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

/*
	func removeSpace(name string) string {
		tilog.PlainInfo("old string:" + name)
		index := regexp.MustCompile(`\.\s`).FindStringIndex(name)
		//fmt.Println(index)
		if len(index) > 0 {
			name = name[:index[0]] + name[index[0]+2:]

		}
		tilog.PlainInfo("new string:" + name)
		return name
	}
*/
