package events

import (
	"context"
	"encoding/json"
	"time"

	"go.mongodb.org/mongo-driver/v2/bson"
)

// Envelope is the canonical incoming event envelope.
type Envelope struct {
	EventID         string          `json:"event_id"`
	Type            string          `json:"type"`
	OrganizationRef bson.ObjectID   `json:"organization_ref"`
	OccurredAt      time.Time       `json:"occurred_at"`
	PublishedAt     time.Time       `json:"published_at,omitempty"`
	Data            json.RawMessage `json:"data"`
}

// Service parses incoming messages and builds outbound payload bytes.
type Service interface {
	Parse(data []byte) (*Envelope, error)
	BuildPayload(ctx context.Context, envelope *Envelope) ([]byte, error)
}

// Payload is the stable outbound JSON body.
type Payload struct {
	EventID         string          `json:"event_id"`
	Type            string          `json:"type"`
	OrganizationRef bson.ObjectID   `json:"organization_ref"`
	OccurredAt      string          `json:"occurred_at"`
	PublishedAt     string          `json:"published_at,omitempty"`
	Data            json.RawMessage `json:"data"`
}
