package lark

import (
	"github.com/gin-gonic/gin"
	"github.com/marmotedu/errors"
	srvv1 "github.com/pingcap-inc/pinsights/internal/apiserver/service/v1"
	"github.com/pingcap-inc/pinsights/internal/apiserver/store"
	"github.com/pingcap-inc/pinsights/internal/pkg/code"
	"github.com/pingcap-inc/pinsights/internal/pkg/middleware"
	"github.com/pingcap-inc/pinsights/model"
	"github.com/pingcap-inc/pinsights/pkg/log"
	"github.com/pingcap-inc/pinsights/pkg/util/core"
)

type LarkUserController struct {
	srv srvv1.Service
}

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

func (u *LarkUserController) Get(c *gin.Context) {
	log.L(c).Info("get lark user function called.")

	var authTokenInfo middleware.AuthingTokenInfo
	v, ok := c.Get("AUTHING_TOKEN_INFO")
	authTokenInfo, typeOk := v.(middleware.AuthingTokenInfo)
	if !ok || !typeOk {
		core.WriteResponse(c, errors.WithCode(code.ErrGetAuthingTokenInfo, ""), nil)

		return
	}

	if authTokenInfo.Uid == "" {
		core.WriteResponse(c, errors.WithCode(code.ErrGetAuthingTokenInfo, "%s", "No valid userId from auth middleware"), nil)

		return
	}

	params := core.ParseQuery(c, "uid")
	if params["uid"] == "" {
		core.WriteResponse(c, errors.WithCode(code.ErrValidation, ""), nil)
		return
	}

	mparams := &model.GetLarkUserParams{
		Uid: params["uid"],
	}

	user, err := u.srv.LarkUser().GetUserInfo(c, mparams, authTokenInfo.Uid, authTokenInfo.Email)
	if err != nil {
		core.WriteResponse(c, err, nil)

		return
	}

	core.WriteResponse(c, nil, user)
}
