package lark

import (
	"encoding/json"
	"log/slog"
	"net/http"

	"github.com/gin-gonic/gin"

	"github.com/tidbcloud/jiraport/pkg/clients/lambda"
)

type Lark struct {
	logger        *slog.Logger
	notifyAddress string
	lambdaClient  lambda.Interface
}

// create lark service and register route in gin router
func New(
	r *gin.RouterGroup,
	logger *slog.Logger,
	notifyAddress string,
	lambdaClient lambda.Interface,
) (*Lark, error) {
	l := &Lark{
		logger:        logger,
		notifyAddress: notifyAddress,
		lambdaClient:  lambdaClient,
	}

	r.POST("/ack", l.ackEventHandler)
	return l, nil
}

type AckWebhookEvent struct {
	MessageIndex string `json:"message_id"`
}

// handle http post and send ack event to resolver
func (lk *Lark) ackEventHandler(ctx *gin.Context) {
	var ack AckWebhookEvent
	err := ctx.ShouldBindJSON(&ack)
	if err != nil {
		lk.logger.Error("request body bind error", "err", err)
		ctx.Status(http.StatusBadRequest)
		return
	}

	lk.logger.Info("receive lark ack event", "message_id", ack.MessageIndex)
	payload, err := json.Marshal(ack)
	if err != nil {
		lk.logger.Error("json marshal error",
			"err", err,
			"message_id", ack.MessageIndex)
		ctx.Status(http.StatusBadRequest)
		return
	}
	ev := lambda.Event{
		Name:    "NotificationAck",
		Payload: payload,
	}
	if err := lk.lambdaClient.InvokeAsync(ctx, ev); err != nil {
		lk.logger.Error("invoke lambda error",
			"err", err,
			"message_id", ack.MessageIndex,
			"lambdaEvent", ev)
		ctx.Status(http.StatusInternalServerError)
		return
	}
	lk.logger.Info("handle lark ack event success", "message_id", ack.MessageIndex)
	ctx.Status(http.StatusOK)
}
