package validator

import (
	"errors"
	"strings"

	"github.com/go-playground/locales/en"
	ut "github.com/go-playground/universal-translator"
	"github.com/go-playground/validator/v10"
	en_translations "github.com/go-playground/validator/v10/translations/en"
	"github.com/pingcap/dbaas/billing2/billing_errors"
	"github.com/pingcap/dbaas/billing2/utils/panicIf"
)

var validate = validator.New()
var trans ut.Translator

func init() {
	var en = en.New()
	var uni = ut.New(en, en)
	var ok bool
	trans, ok = uni.GetTranslator("en")
	if !ok {
		panic("not found translator")
	}

	panicIf.Error(en_translations.RegisterDefaultTranslations(validate, trans))
}

func ValidateStruct(obj interface{}) error {
	err := validate.Struct(obj)
	if err != nil {
		if err != nil {

			// translate all error at once
			errs := err.(validator.ValidationErrors)
			res := errs.Translate(trans)
			res_values := []string{}
			for _, v := range res {
				res_values = append(res_values, v)
			}
			return billing_errors.NewInvalidInputError(errors.New("[" + strings.Join(res_values, ", ") + "]"))
		}
	}
	return nil
}
