package usecase

// Import necessary packages
import (
	"context"
)

type NotificationUseCase interface {
	EventUseCase
	UserNotificationUseCase
	CursorUseCase
}
type NotificationEvent struct {
	EventType  string // POST_PUBLISHED / COMMENT_ADDED / MENTIONED ...
	ActorUID   string // 觸發者 UID
	ObjectType string // POST / COMMENT / USER ...
	ObjectID   string // 對應物件 ID（post_id 等）
	Title      string // 顯示用標題
	Body       string // 顯示用內容 / 摘要
	Payload    string // JSON string（額外欄位，例如 {"postId": "..."}）
	Priority   string //  critical, high, normal, low
}

type NotificationEventResp struct {
	EventID    string `json:"event_id"`
	EventType  string `json:"event_type"`
	ActorUID   string `json:"actor_uid"`
	ObjectType string `json:"object_type"`
	ObjectID   string `json:"object_id"`
	Title      string `json:"title"`
	Body       string `json:"body"`
	Payload    string `json:"payload"`
	Priority   string `json:"priority"`
	CreatedAt  string `json:"created_at"`
}

type QueryNotificationEventParam struct {
	ObjectID   *string
	ObjectType *string
	Limit      *int
}

type EventUseCase interface {
	// CreateEvent creates a new notification event.
	CreateEvent(ctx context.Context, e *NotificationEvent) error

	// GetEventByID retrieves an event by its ID.
	GetEventByID(ctx context.Context, id string) (*NotificationEventResp, error)

	// ListEventsByObject lists events related to a specific object.
	ListEventsByObject(ctx context.Context, param QueryNotificationEventParam) ([]*NotificationEventResp, error)
}

type UserNotification struct {
	UserID  string `json:"user_id"`  // 收通知的人
	EventID string `json:"event_id"` // 對應 notification_event.event_id
	TTL     int    `json:"ttl"`
}

type ListLatestOptions struct {
	UserID  string
	Buckets []string // e.g. []string{"202511", "202510"}
	Limit   int      // 建議在 service 層限制最大值，例如 <= 100
}

type UserNotificationResponse struct {
	UserID  string  `json:"user_id"`           // 收通知的人
	Bucket  string  `json:"bucket"`            // 分桶，例如 '2025-11' 或 '2025-11-17'
	TS      string  `json:"ts"`                // 通知時間，用 now() 產生，排序用(UTC0)
	EventID string  `json:"event_id"`          // 對應 notification_event.event_id
	Status  string  `json:"status"`            // UNREAD / READ / ARCHIVED
	ReadAt  *string `json:"read_at,omitempty"` // 已讀時間（非必填）
}

// UserNotificationUseCase  handles user-specific notification operations.
type UserNotificationUseCase interface {
	// CreateUserNotification creates a notification for a single user.
	CreateUserNotification(ctx context.Context, n *UserNotification) error

	// BulkCreateNotifications creates multiple notifications in batch.
	BulkCreateNotifications(ctx context.Context, list []*UserNotification) error

	// ListLatestNotifications lists the latest notifications for a user.
	ListLatestNotifications(ctx context.Context, opt ListLatestOptions) ([]*UserNotificationResponse, error)

	// MarkAsRead marks a single notification as read.
	MarkAsRead(ctx context.Context, userID, bucket string, ts string) error

	// MarkAllAsRead marks all notifications in specified buckets as read.
	MarkAllAsRead(ctx context.Context, userID string, buckets []string) error

	// CountUnread approximates the count of unread notifications.
	CountUnread(ctx context.Context, userID string, buckets []string) (int64, error)
}

type NotificationCursor struct {
	UID        string
	LastSeenTS string
	UpdatedAt  string
}

type UpdateNotificationCursorParam struct {
	UID        string
	LastSeenTS string
}

// CursorUseCase  handles notification cursor operations for efficient reading.
type CursorUseCase interface {
	// GetCursor retrieves the notification cursor for a user.
	GetCursor(ctx context.Context, userID string) (*NotificationCursor, error)

	// UpdateCursor updates or inserts the cursor for a user.
	UpdateCursor(ctx context.Context, cursor *UpdateNotificationCursorParam) error
}
