package notification import ( "context" "fmt" ) // SDK provides a high-level interface for the notification service type SDK struct { service NotificationService config *Config } // NewSDK creates a new notification SDK with the provided configuration and logger func New(config *Config, logger Logger) (*SDK, error) { if config == nil { config = DefaultConfig() } client, err := NewClient(config, logger) if err != nil { return nil, fmt.Errorf("failed to create notification client: %w", err) } service := NewService(client) return &SDK{ service: service, config: config, }, nil } // NewSDKWithClient creates a new notification SDK with a custom HTTP client func NewSDKWithClient(config *Config, httpClient HTTPClient, logger Logger) (*SDK, error) { if config == nil { config = DefaultConfig() } client, err := NewClientWithHTTPClient(config, httpClient, logger) if err != nil { return nil, fmt.Errorf("failed to create notification client: %w", err) } service := NewService(client) return &SDK{ service: service, config: config, }, nil } // SendNotification sends a custom notification request func (s *SDK) SendNotification(ctx context.Context, req *NotificationRequest) (*NotificationResponse, error) { return s.service.SendNotification(ctx, req) } // SendEmail sends an email notification func (s *SDK) SendEmail(ctx context.Context, email, message, userID string) (*NotificationResponse, error) { return s.service.SendEmail(ctx, email, message, userID) } // SendSMS sends an SMS notification func (s *SDK) SendSMS(ctx context.Context, phoneNumber, message, userID string) (*NotificationResponse, error) { return s.service.SendSMS(ctx, phoneNumber, message, userID) } // SendPush sends a push notification func (s *SDK) SendPush(ctx context.Context, deviceToken, message, userID string) (*NotificationResponse, error) { return s.service.SendPush(ctx, deviceToken, message, userID) } // SendOTP sends an OTP notification func (s *SDK) SendOTP(ctx context.Context, phoneNumber, message, userID string) (*NotificationResponse, error) { return s.service.SendOTP(ctx, phoneNumber, message, userID) } // NewBuilder creates a new notification builder for fluent API usage func (s *SDK) NewBuilder() Builder { return s.service.(*Service).NewBuilder() } // Health checks if the notification service is available func (s *SDK) Health(ctx context.Context) error { return s.service.Health(ctx) } // GetConfig returns the current configuration func (s *SDK) GetConfig() *Config { return s.config } // Convenience functions for quick notifications // QuickEmail sends a simple email notification func (s *SDK) QuickEmail(ctx context.Context, email, message string) error { _, err := s.SendEmail(ctx, email, message, "") return err } // QuickSMS sends a simple SMS notification func (s *SDK) QuickSMS(ctx context.Context, phoneNumber, message string) error { _, err := s.SendSMS(ctx, phoneNumber, message, "") return err } // QuickPush sends a simple push notification func (s *SDK) QuickPush(ctx context.Context, deviceToken, message string) error { _, err := s.SendPush(ctx, deviceToken, message, "") return err } // QuickOTP sends a simple OTP notification func (s *SDK) QuickOTP(ctx context.Context, phoneNumber, message string) error { _, err := s.SendOTP(ctx, phoneNumber, message, "") return err } // Batch operations for sending multiple notifications // BatchRequest represents a batch notification request type BatchRequest struct { Requests []*NotificationRequest `json:"requests"` } // BatchResponse represents the response from batch operations type BatchResponse struct { Responses []BatchItemResponse `json:"responses"` Success int `json:"success"` Failed int `json:"failed"` } // BatchItemResponse represents individual response in batch type BatchItemResponse struct { Index int `json:"index"` Success bool `json:"success"` Response *NotificationResponse `json:"response,omitempty"` Error string `json:"error,omitempty"` } // SendBatch sends multiple notifications in batch (sequential for now) func (s *SDK) SendBatch(ctx context.Context, requests []*NotificationRequest) (*BatchResponse, error) { if len(requests) == 0 { return &BatchResponse{ Responses: []BatchItemResponse{}, Success: 0, Failed: 0, }, nil } responses := make([]BatchItemResponse, len(requests)) successCount := 0 failedCount := 0 for i, req := range requests { resp, err := s.service.SendNotification(ctx, req) if err != nil { responses[i] = BatchItemResponse{ Index: i, Success: false, Error: err.Error(), } failedCount++ } else { responses[i] = BatchItemResponse{ Index: i, Success: true, Response: resp, } successCount++ } } return &BatchResponse{ Responses: responses, Success: successCount, Failed: failedCount, }, nil }