package app

import (
    "net/http"
    "time"

    "bindbox-game/configs"
    "bindbox-game/internal/code"
    "bindbox-game/internal/pkg/core"
    "bindbox-game/internal/pkg/jwtoken"
    "bindbox-game/internal/pkg/validation"
    "bindbox-game/internal/pkg/wechat"
    "bindbox-game/internal/proposal"
    usersvc "bindbox-game/internal/service/user"
)

type weixinLoginRequest struct {
    Code       string `json:"code"`
    InviteCode string `json:"invite_code"`
    DouyinID   string `json:"douyin_id"`
}
type weixinLoginResponse struct {
    UserID     int64  `json:"user_id"`
    Nickname   string `json:"nickname"`
    Avatar     string `json:"avatar"`
    InviteCode string `json:"invite_code"`
    OpenID     string `json:"openid"`
    Token      string `json:"token"`
}

// WeixinLogin 微信登录
// @Summary 微信登录
// @Description 微信静默登录（需传递 code；可选 invite_code）
// @Tags APP端.用户
// @Accept json
// @Produce json
// @Param RequestBody body weixinLoginRequest true "请求参数"
// @Success 200 {object} weixinLoginResponse
// @Failure 400 {object} code.Failure
// @Router /api/app/users/weixin/login [post]
func (h *handler) WeixinLogin() core.HandlerFunc {
	return func(ctx core.Context) {
		req := new(weixinLoginRequest)
		rsp := new(weixinLoginResponse)
		if err := ctx.ShouldBindJSON(req); err != nil {
			ctx.AbortWithError(core.Error(http.StatusBadRequest, code.ParamBindError, validation.Error(err)))
			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
		}

        in := usersvc.LoginWeixinInput{OpenID: c2s.OpenID, UnionID: c2s.UnionID, InviteCode: req.InviteCode, DouyinID: req.DouyinID}
        u, err := h.user.LoginWeixin(ctx.RequestContext(), in)
        if err != nil {
            ctx.AbortWithError(core.Error(http.StatusBadRequest, 10006, err.Error()))
            return
        }
        rsp.UserID = u.ID
        rsp.Nickname = u.Nickname
        rsp.Avatar = u.Avatar
        rsp.InviteCode = u.InviteCode
        rsp.OpenID = c2s.OpenID
        sessionUserInfo := proposal.SessionUserInfo{Id: int32(u.ID), UserName: u.Nickname, NickName: u.Nickname, IsSuper: 0, Platform: "APP"}
        tokenString, tErr := jwtoken.New(configs.Get().JWT.PatientSecret).Sign(sessionUserInfo, 30*24*time.Hour)
        if tErr == nil {
            rsp.Token = tokenString
        }
        ctx.Payload(rsp)
    }
}
