package model

import (
	"time"

	"github.com/tech/sendico/pkg/db/storable"
	"github.com/tech/sendico/pkg/model"
)

// OutboxEvent represents a pending event to be published to NATS.
// Part of the transactional outbox pattern for reliable event delivery.
type OutboxEvent struct {
	storable.Base               `bson:",inline" json:",inline"`
	model.OrganizationBoundBase `bson:",inline" json:",inline"`

	EventID  string       `bson:"eventId" json:"eventId"`   // deterministic ID for NATS Msg-Id deduplication
	Subject  string       `bson:"subject" json:"subject"`   // NATS subject to publish to
	Payload  []byte       `bson:"payload" json:"payload"`   // JSON-encoded event data
	Status   OutboxStatus `bson:"status" json:"status"`     // pending, sent, failed
	Attempts int          `bson:"attempts" json:"attempts"` // number of delivery attempts
	SentAt   *time.Time   `bson:"sentAt,omitempty" json:"sentAt,omitempty"`
}

// Collection implements storable.Storable.
func (*OutboxEvent) Collection() string {
	return OutboxCollection
}
