package lark

import (
	"errors"

	"github.com/gin-gonic/gin"
	larkcard "github.com/larksuite/oapi-sdk-go/v3/card"
	larkevent "github.com/larksuite/oapi-sdk-go/v3/event"

	larkapi "github.com/tidbcloud/aisupport/packages/sdk-go/contracts/api/ticket-manager/lark"
	"github.com/tidbcloud/aisupport/packages/sdk-go/infra/apiserver/middlewares"
	apiutils "github.com/tidbcloud/aisupport/packages/sdk-go/infra/apiserver/utils"
)

func (h *LarkHandler) HandleLarkEvent(c *gin.Context) {
	val, exist := c.Get(middlewares.CtxLarkEvent)
	if !exist {
		apiutils.Fail(c, errors.New("received a lark event but event is not exist"))
		return
	}

	body, ok := val.(*larkevent.EventV2Body)
	if !ok {
		apiutils.Fail(c, errors.New("received a lark event but event type is invalid"))
		return
	}

	if err := h.eventDispatcher.Dispatch(c, body); err != nil {
		apiutils.Fail(c, err)
		return
	}

	apiutils.Success(c, &larkapi.EventResponse{})
}

func (h *LarkHandler) HandleLarkCard(c *gin.Context) {
	val, exist := c.Get(middlewares.CtxLarkCardAction)
	if !exist {
		apiutils.Fail(c, errors.New("received a lark card but card action is not exist"))
		return
	}

	cardAction, ok := val.(*larkcard.CardAction)
	if !ok {
		apiutils.Fail(c, errors.New("received a lark card but type is invalid"))
		return
	}

	start, err := h.cardDispatcher.Dispatch(c, cardAction)
	if err != nil {
		apiutils.Fail(c, err)
		return
	}
	defer start()

	apiutils.Success(c, &larkapi.EventResponse{})
}
