package lark

import (
	"github.com/gin-gonic/gin"
	"github.com/gin-gonic/gin/binding"
	"github.com/golang-jwt/jwt/v4"

	srvv1 "github.com/pingcap-inc/pchub/internal/apiserver/service/v1"
	"github.com/pingcap-inc/pchub/internal/apiserver/store"
	modelv1 "github.com/pingcap-inc/pchub/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 LarkApprOptionsController struct {
	srv srvv1.Service
}

const (
	tokenSec = "h878f3nf*()*HNDF"
)

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

func (op *LarkApprOptionsController) Get(c *gin.Context) {
	log.L(c).Info("LarkApprOptionsController.Get called.")
	entityName := c.Param("entity")

	var b modelv1.LarkApprOptionsBody
	if err := c.ShouldBindBodyWith(&b, binding.JSON); err != nil {
		ginres.WriteRawResponse(c, err, nil)

		return
	}

	tk, err := jwt.Parse(b.Token, func(token *jwt.Token) (interface{}, error) {
		_, ok := token.Claims.(jwt.MapClaims)
		if !ok {
			return nil, errors.New("Unrecognized token.")
		}

		return []byte(tokenSec), nil
	})
	if err != nil {
		ginres.WriteRawResponse(c, errors.New("Unrecognized token."), nil)

		return
	}

	_, ok := tk.Claims.(jwt.MapClaims)

	if !ok || !tk.Valid {
		ginres.WriteRawResponse(c, errors.New("Unrecognized token."), nil)

		return
	}

	res, err := op.srv.ApprOptions().List(c, entityName, &b)
	ginres.WriteRawResponse(c, err, res)
}
