package publisher

import (
	"github.com/UpmeshLTD/urus-aio/infrastructure/broker"
	"github.com/UpmeshLTD/urus-aio/infrastructure/db/entities"
	"github.com/UpmeshLTD/urus-aio/shipment/publishers"
	"github.com/google/uuid"
	"log"
	"time"
)

type Service interface {
	PublishShipmentStatusChangedMessage(shipment *entities.Shipment) error
	PublishShipmentArchivedMessage(shipment *entities.Shipment) error
}

type serviceImpl struct {
	broker broker.MessageBroker
}

func NewService(
	broker broker.MessageBroker,
) Service {
	return &serviceImpl{
		broker: broker,
	}
}

func (s serviceImpl) PublishShipmentStatusChangedMessage(shipment *entities.Shipment) error {
	if !publishers.IsNeedToPublishShipmentStatusChangeMessage(shipment.Status) {
		return nil
	}
	log.Printf("[PublishShipmentStatusChangedMessage] Publishing message shipment status of cart %s changed to %s\n", shipment.CartID, shipment.Status.Value())
	id := uuid.New().String()
	payload := broker.MessageBrokerBody{
		MessageId: id,
		Message: publishers.ShipmentStatusPayload{
			CartID:          shipment.CartID,
			ShippingGroupID: shipment.ShippingGroupID,
			ShipmentStatus:  shipment.Status.Value(),
			StatusUpdatedAt: shipment.StateDate.Format(time.RFC3339),
		},
		MessageType: []string{"urn:message:Upmesh.Application.Shipments.DomainEvents:LogisticShipmentStatusUpdatedDomainEvent"},
	}
	return s.broker.Publish(publishers.BrokerTopicShipmentStatus, id, payload)
}

func (s serviceImpl) PublishShipmentArchivedMessage(shipment *entities.Shipment) error {
	log.Printf("[PublishShipmentArchivedMessage] Publishing shipment of cart %s archived message\n", shipment.CartID)
	messageId := uuid.New().String()
	payload := broker.MessageBrokerBody{
		MessageId: messageId,
		Message: publishers.ShipmentStatusPayload{
			CartID:          shipment.CartID,
			ShippingGroupID: shipment.ShippingGroupID,
			ShipmentStatus:  "archived",
			StatusUpdatedAt: shipment.ArchivedAt.Format(time.RFC3339),
		},
		MessageType: []string{"urn:message:Upmesh.Application.Shipments.DomainEvents:LogisticShipmentStatusUpdatedDomainEvent"},
	}
	return s.broker.Publish(publishers.BrokerTopicShipmentStatus, messageId, payload)
}
