package main

import (
	"encoding/json"
	"fmt"
	"github.com/go-playground/locales/en"
	"github.com/go-playground/locales/zh"
	"github.com/go-playground/locales/zh_Hant_TW"
	ut "github.com/go-playground/universal-translator"
	"github.com/go-playground/validator/v10"
	entranslations "github.com/go-playground/validator/v10/translations/en"
	zhtranslations "github.com/go-playground/validator/v10/translations/zh"
	zhtwtranslations "github.com/go-playground/validator/v10/translations/zh_tw"
	"reflect"
	"strings"
)

type InternalAccountTransferRequest struct {
	Name  string `json:"name" binding:"required"`
	Age   string `json:"age_test" binding:"required"`
	Class string `binding:"required"`
}

func main() {
	s := `{"name": "123"}`
	var requset InternalAccountTransferRequest
	json.Unmarshal([]byte(s), &requset)
	//requset.Class = "123"

	v := validator.New()

	var err error
	uni := ut.New(en.New(), en.New(), zh_Hant_TW.New(), zh.New())

	zh_, _ := uni.GetTranslator("zh")
	zhtranslations.RegisterDefaultTranslations(v, zh_)
	tw_, _ := uni.GetTranslator("zh_Hant_TW")
	zhtwtranslations.RegisterDefaultTranslations(v, tw_)
	en_, _ := uni.GetTranslator("en")

	err = entranslations.RegisterDefaultTranslations(v, en_)
	if err != nil {
		panic(err)
	}

	v.RegisterTagNameFunc(func(fld reflect.StructField) string {
		name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]

		if name == "-" {
			return ""
		}

		return name
	})
	v.SetTagName("binding")
	err = v.Struct(requset)
	fmt.Println("validErr:", err)
	errs := err.(validator.ValidationErrors)
	fmt.Println(errs.Translate(zh_))
	fmt.Println(errs.Translate(en_))
	fmt.Println(errs.Translate(tw_))
}