package ack

import (
	"context"

	"jiraport/pkg/log"
	"jiraport/pkg/queue"
	"jiraport/service/lark"
	ntf "jiraport/service/notification"
)

type AckEventHandler struct {
	ns *ntf.Notifications
}

func New(ns *ntf.Notifications) (*AckEventHandler, error) {
	return &AckEventHandler{
		ns: ns,
	}, nil
}

func (handler *AckEventHandler) Handle(ctx context.Context, ev queue.Event) {
	log.Debug("handle", ev.Name)
	msgIndex, ok := ev.Payload.(lark.MessageIndex)
	if !ok {
		log.Error("msg", "unexpected payload", "payload", ev.Payload)
		return
	}
	msg, err := handler.ns.GetMessageShallow(&msgIndex)
	if err != nil {
		log.Error("msg", "get message error", "msg_index", msgIndex)
		return
	}
	log.Debug("msg", "notification ack", "msg_index", msg.MessageIndex, "notification", msg.NotificationID)
	err = handler.ns.Transition(msg.NotificationID, ntf.AcknowledgeEvent)
	err = ntf.HandleTransitionError(err, func(te *ntf.TransitionError) error {
		log.Warn("msg", "do transition error", "err", te)
		return nil
	})
	if err != nil {
		log.Error("msg", "do transition error", "err", err)
	}
}
