package middleware

import (
	"fmt"
	"net/http"
	"strconv"

	"github.com/gin-gonic/gin"
	"github.com/pingcap/dbaas/billing2/utils/user"
)

const AccountUserIDHeaderKey = "X-ACCOUNT-USER-ID"
const AccountUserEmailHeaderKey = "X-ACCOUNT-USER-EMAIL"

func parseUserInfo(c *gin.Context, userInfo *user.UserInfo) error {
	emailValArr, ok := c.Request.Header[http.CanonicalHeaderKey(AccountUserEmailHeaderKey)]
	if ok && len(emailValArr) != 0 {
		userInfo.Email = emailValArr[0]
	}
	idValArr, ok := c.Request.Header[http.CanonicalHeaderKey(AccountUserIDHeaderKey)]
	if !ok {
		return fmt.Errorf(`get UserID from Headers failed: key not exisited`)
	}
	if len(idValArr) == 0 {
		return fmt.Errorf(`get UserID from Headers failed: no values`)
	}
	userId, err := strconv.ParseUint(idValArr[0], 10, 64)
	if err != nil {
		return err
	}
	userInfo.UserID = userId
	return nil
}

func UserMiddleware(c *gin.Context) {
	userInfo := user.NewUserInfo()
	_ = parseUserInfo(c, userInfo)
	user.SetCurrentUserInfo(userInfo)
	c.Next()
}
