package middleware

import (
	"q5"

	"github.com/gin-gonic/gin"
)

func MaybeJwtAuth(c *gin.Context) {
	internalJwtAuth(c, true)
}

func JwtAuth(c *gin.Context) {
	internalJwtAuth(c, false)
}

/*
	'Authorization Bearer {JwtToken}'
*/
func internalJwtAuth(c *gin.Context, maybe bool) {
	tokenHeader := c.Request.Header.Get("Authorization")
	jwtToken := ""
	if len(tokenHeader) > 8 {
		jwtToken = tokenHeader[7:]
	} else {
		if maybe {
			c.Set("open_id", "")
			c.Set("account_address", "")
			c.Set("email", "")
			c.Next()
			return
		}
	}

	tmpStrings := q5.StrSplit(jwtToken, ".")
	if len(tmpStrings) > 3 {
		internalMetaMaskJwtAuth(c, jwtToken)
	} else {
		internalImmutJwtAuth(c, jwtToken)
	}
}

func internalImmutJwtAuth(c *gin.Context, jwtToken string) {
	// params := map[string]string{
	// 	"c": "Jwt",
	// 	"a": "verify",
	// }
	// jsonReqObj := &struct {
	// 	JwksUri string `json:"jwksUri"`
	// 	Data string `json:"data"`
	// }{
	// 	JwksUri: mt.Table.Config.GetJwksUri(),
	// 	Data: jwtToken,
	// }
	// jsonRspObj := &struct {
	// 	ErrCode interface{} `json:"errcode"`
	// 	ErrMsg string `json:"errmsg"`
	// 	Decoded struct {
	// 		Sub string `json:"sub"`
	// 		Email string `json:"email"`
	// 		EmailVerified bool `json:"email_verified"`
	// 		Sid string `json:"sid"`
	// 		Passport struct {
	// 			ZkevmEthAddress string `json:"zkevm_eth_address"`
	// 		} `json:"passport"`
	// 	} `json:"decoded"`
	// }{}
	// rspObj := &struct {
	// 	ErrCode interface{} `json:"errcode"`
	// 	ErrMsg string `json:"errmsg"`
	// }{}
	// paramsStr := q5.EncodeJson(jsonReqObj)
	// url := fmt.Sprintf("%s/webapp/index.php", mt.Table.Web3ServiceCluster.RandElement().GetUrl())
	// f5.GetHttpCliMgr().SendGoStyleJsonRspPost(
	// 	url,
	// 	params,
	// 	jsonRspObj,
	// 	q5.HTTP_HEADER_JSON,
	// 	paramsStr,
	// 	func(rsp f5.HttpCliResponse) {
	// 		if rsp.GetErr() != nil ||
	// 			!rsp.JsonParseOk() {
	// 			rspObj.ErrCode = 500
	// 			rspObj.ErrMsg = "server internal error"
	// 			c.JSON(200, rspObj)
	// 			c.Abort()
	// 			return
	// 		}
	// 		rspObj.ErrCode = q5.SafeToInt32(jsonRspObj.ErrCode)
	// 		rspObj.ErrMsg = jsonRspObj.ErrMsg
	// 		if q5.SafeToInt32(rspObj.ErrCode) != 0 {
	// 			rspObj.ErrCode = 501
	// 			rspObj.ErrMsg = "jwt expired"
	// 			c.JSON(200, rspObj)
	// 			c.Abort()
	// 			return
	// 		}
	// 		openId := fmt.Sprintf("%d_2006_%s", jccommon.IMTBL_CHANNEL, jsonRspObj.Decoded.Sub)
	// 		c.Set("open_id", openId)
	// 		c.Set("account_address", jsonRspObj.Decoded.Passport.ZkevmEthAddress)
	// 		c.Set("email", jsonRspObj.Decoded.Email)
	// 		c.Next()
	// 	})
}

func internalMetaMaskJwtAuth(c *gin.Context, jwtToken string) {
	// params := map[string]string{
	// 	"c": "MetaMaskJwt",
	// 	"a": "verify",
	// }
	// jsonReqObj := &struct {
	// 	Data string `json:"data"`
	// }{
	// 	Data: jwtToken,
	// }
	// jsonRspObj := &struct {
	// 	ErrCode interface{} `json:"errcode"`
	// 	ErrMsg string `json:"errmsg"`
	// 	Decoded struct {
	// 		Id string `json:"id"`
	// 		OpenId string `json:"openid"`
	// 		Plat int32 `json:"plat"`
	// 		Version int32 `json:"version"`
	// 		Email string `json:"email"`
	// 	} `json:"decoded"`
	// }{}
	// rspObj := &struct {
	// 	ErrCode interface{} `json:"errcode"`
	// 	ErrMsg string `json:"errmsg"`
	// }{}
	// paramsStr := q5.EncodeJson(jsonReqObj)
	// url := fmt.Sprintf("%s/webapp/index.php", mt.Table.Web3ServiceCluster.RandElement().GetUrl())
	// f5.GetHttpCliMgr().SendGoStyleJsonRspPost(
	// 	url,
	// 	params,
	// 	jsonRspObj,
	// 	q5.HTTP_HEADER_JSON,
	// 	paramsStr,
	// 	func(rsp f5.HttpCliResponse) {
	// 		if rsp.GetErr() != nil ||
	// 			!rsp.JsonParseOk() {
	// 			rspObj.ErrCode = 500
	// 			rspObj.ErrMsg = "server internal error"
	// 			c.JSON(200, rspObj)
	// 			c.Abort()
	// 			return
	// 		}
	// 		rspObj.ErrCode = q5.SafeToInt32(jsonRspObj.ErrCode)
	// 		rspObj.ErrMsg = jsonRspObj.ErrMsg
	// 		if q5.SafeToInt32(rspObj.ErrCode) != 0 {
	// 			rspObj.ErrCode = 501
	// 			rspObj.ErrMsg = "jwt error"
	// 			c.JSON(200, rspObj)
	// 			c.Abort()
	// 			return
	// 		}
	// 		if jsonRspObj.Decoded.Plat != jccommon.BC_POLY_POLY_METAKASK {
	// 			rspObj.ErrCode = 501
	// 			rspObj.ErrMsg = "not support this platform"
	// 			c.JSON(200, rspObj)
	// 			c.Abort()
	// 			f5.GetSysLog().Info("not support this platform:%s", rsp.GetRawData())
	// 			return
	// 		}
	// 		openId := fmt.Sprintf("%d_2006_%s",
	// 			jccommon.BC_CHANNEL,
	// 			strings.ToLower(jsonRspObj.Decoded.OpenId))
	// 		c.Set("open_id", openId)
	// 		c.Set("account_address", strings.ToLower(jsonRspObj.Decoded.OpenId))
	// 		c.Set("email", strings.ToLower(jsonRspObj.Decoded.Email))
	// 		c.Next()
	// 	})
}
