package notification

import (
	"context"
)

// NotificationService defines the interface for notification operations
type NotificationService interface {
	// SendNotification sends a notification using the configured client
	SendNotification(ctx context.Context, req *NotificationRequest) (*NotificationResponse, error)

	// SendEmail sends an email notification
	SendEmail(ctx context.Context, model Model) (*NotificationResponse, error)

	// SendSMS sends an SMS notification
	SendSMS(ctx context.Context, model Model) (*NotificationResponse, error)

	// SendPush sends a push notification
	SendPush(ctx context.Context, model Model) (*NotificationResponse, error)

	// SendOTP sends an OTP notification
	SendOTP(ctx context.Context, model Model) (*NotificationResponse, error)

	// GetNotifications retrieves a list of notifications
	GetNotifications(ctx context.Context, req *GetNotificationsRequest) (*NotificationListResponse, error)

	// GetNotification retrieves a single notification by ID
	GetNotification(ctx context.Context, notificationID string) (*DetailedNotificationResponse, error)

	// MarkSeen marks a notification as seen
	MarkSeen(ctx context.Context, notificationID string) (*MarkSeenResponse, error)

	// AllMarkSeen marks all notifications as seen for a user
	AllMarkSeen(ctx context.Context, userID string) (*MarkSeenResponse, error)

	// Health checks if the notification service is available
	Health(ctx context.Context) error

	// NewBuilder creates a new notification builder
	NewBuilder() Builder
}

// Builder provides a fluent interface for building notification requests
type Builder interface {
	// SetEventType sets the event type
	SetEventType(eventType EventType) Builder

	// SetMessage sets the notification message
	SetMessage(message string) Builder

	// SetUserID sets the user ID
	SetUserID(userID string) Builder

	// SetEmail sets the email address
	SetEmail(email string) Builder

	// SetSMS sets the SMS phone number
	SetSMS(phoneNumber string) Builder

	// SetPush sets the push device token
	SetPush(deviceToken string) Builder

	// SetOTP sets the OTP phone number
	SetOTP(phoneNumber string) Builder

	// SetTitle sets the notification title
	SetTitle(title string) Builder

	// SetType sets the notification type
	SetType(notificationType string) Builder

	// SetPriority sets the notification priority
	SetPriority(priority string) Builder

	// SetScheduledAt sets the scheduled delivery time (0 for immediate)
	SetScheduledAt(scheduledAt int64) Builder

	// Build creates the notification request
	Build() (*NotificationRequest, error)

	// Send builds and sends the notification
	Send(ctx context.Context) (*NotificationResponse, error)
}
