package common

import (
	"net/http"

	"bindbox-game/configs"
	"bindbox-game/internal/pkg/core"
	"bindbox-game/internal/pkg/wechat"
)

type openidRequest struct {
	Code string `json:"code" binding:"required"`
}

type openidResponse struct {
	OpenID  string `json:"openid"`
	UnionID string `json:"unionid"`
}

// GetOpenID 通过 code 获取 openid (不涉及登录)
func (h *handler) GetOpenID() core.HandlerFunc {
	return func(ctx core.Context) {
		req := new(openidRequest)
		if err := ctx.ShouldBindJSON(req); err != nil {
			ctx.AbortWithError(core.Error(http.StatusBadRequest, 10001, err.Error()))
			return
		}

		cfg := configs.Get()
		wxcfg := &wechat.WechatConfig{AppID: cfg.Wechat.AppID, AppSecret: cfg.Wechat.AppSecret}
		c2s, err := wechat.Code2Session(ctx.RequestContext().Context, wxcfg, req.Code)
		if err != nil {
			ctx.AbortWithError(core.Error(http.StatusBadRequest, 10006, err.Error()))
			return
		}

		ctx.Payload(&openidResponse{
			OpenID:  c2s.OpenID,
			UnionID: c2s.UnionID,
		})
	}
}
