package chat

import (
	"strings"

	"github.com/gin-gonic/gin"
	srvv1 "github.com/pingcap-inc/pingcat/internal/apiserver/service/v1"
	"github.com/pingcap-inc/pingcat/internal/apiserver/store"
	"github.com/pingcap-inc/pingcat/internal/pkg/code"
	"github.com/pingcap-inc/pingcat/internal/pkg/middleware"
	v1 "github.com/pingcap-inc/pingcat/model/v1"

	"github.com/pingcap-inc/pchub/pkg/errors"
	"github.com/pingcap-inc/pchub/pkg/log"
	"github.com/pingcap-inc/pchub/pkg/util/ginres"
)

type ChatController struct {
	srv srvv1.Service
}

func NewChatController(store store.Factory) *ChatController {
	return &ChatController{
		srv: srvv1.NewService(store),
	}
}

func (c *ChatController) ReceiveMsg(ctx *gin.Context) {
	log.L(ctx).Info("ChatController.ReceiveMsg function called.")

	var authTokenInfo middleware.AuthingTokenInfo
	v, ok := ctx.Get("tokenInfo")
	authTokenInfo, typeOk := v.(middleware.AuthingTokenInfo)
	if !ok || !typeOk {
		log.L(ctx).Error("tokenInfo not found")
		ginres.WriteResponse(ctx, errors.WithCode(code.ErrTokenInvalid, ""), nil)

		return
	}
	u, err := c.srv.User().GetUserByEmail(ctx, authTokenInfo.Email)
	if err != nil {
		log.L(ctx).Error(errors.Wrap(err, "Error when get user from db").Error())
		ginres.WriteResponse(ctx, err, nil)

		return
	}
	ctx.Set("larkUserID", u.LarkUserID)

	var body v1.MsgReqData
	err = ctx.ShouldBindJSON(&body)
	if err != nil {
		ginres.WriteResponse(ctx, errors.WithCode(code.ErrInvalidJSON, ""), nil)

		return
	}
	if strings.TrimSpace(body.Msg) == "" {
		ginres.WriteResponse(ctx, errors.WithCode(code.ErrValidation, ""), nil)

		return
	}

	msgRes, err := c.srv.Chat().ReplyGeneralMsg(ctx, body)
	if err != nil {
		log.L(ctx).Error(errors.Wrap(err, "Error when reply general msg").Error())
		ginres.WriteResponse(ctx, err, nil)

		return
	}

	ginres.WriteResponse(ctx, nil, msgRes)
}
