package id

import (
	"regexp"
	"strings"

	"git.perx.ru/perxis/perxis-go/pkg/errors"
	"github.com/rs/xid"
)

const (
	MaxLengthID   = 64
	MaxLengthName = 256
)

var (
	ErrEmptyID    = errors.New("empty ID")
	ErrNotValidID = errors.New("id contains invalid characters")
	ErrLongID     = errors.New("id too long (max 64 symbols)")
	ErrEmptyName  = errors.New("empty name")
	ErrLongName   = errors.New("name too long (max 256 symbols)")
	isValidID     = regexp.MustCompile(`^[A-Za-z][A-Za-z0-9-_]*$`).MatchString
)

func GenerateNewID() string {
	return xid.New().String()
}

func ValidateID(id string) error {
	if strings.TrimSpace(id) == "" {
		return ErrEmptyID
	}
	if len(id) > MaxLengthID {
		return ErrLongID
	}
	if !isValidID(id) {
		return errors.WithDetail(ErrNotValidID, "must begin with latin letters and contain latin letters, numbers or '-', '_'")
	}

	return nil
}

func ValidateName(name string) error {
	if strings.TrimSpace(name) == "" {
		return ErrEmptyName
	}
	if len(name) > MaxLengthName {
		return ErrLongName
	}

	return nil
}