package notifications

import (
	"encoding/json"
	"strings"

	messaging "github.com/tech/sendico/pkg/messaging/envelope"
	"github.com/tech/sendico/pkg/model"
	nm "github.com/tech/sendico/pkg/model/notification"
	"github.com/tech/sendico/pkg/mservice"
)

type PaymentStatusUpdatedNotification struct {
	messaging.Envelope
	payload model.PaymentStatusUpdated
}

func (psn *PaymentStatusUpdatedNotification) Serialize() ([]byte, error) {
	data, err := json.Marshal(psn.payload)
	if err != nil {
		return nil, err
	}
	return psn.Wrap(data)
}

func paymentStatusUpdatedEvent() model.NotificationEvent {
	return model.NewNotification(mservice.PaymentOrchestrator, nm.NAUpdated)
}

func NewPaymentStatusUpdatedEnvelope(sender string, status *model.PaymentStatusUpdated) messaging.Envelope {
	payload := model.PaymentStatusUpdated{}
	if status != nil {
		payload = *status
	}
	if strings.TrimSpace(payload.Type) == "" {
		payload.Type = model.PaymentStatusUpdatedType
	}
	return &PaymentStatusUpdatedNotification{
		Envelope: messaging.CreateEnvelope(sender, paymentStatusUpdatedEvent()),
		payload:  payload,
	}
}
