package domain

import (
	"time"
)

// Priority defines the urgency level of a notification
type Priority int

const (
	PriorityLow Priority = iota
	PriorityNormal
	PriorityHigh
	PriorityCritical
)

// NotificationType defines the channel through which to send the notification
type NotificationType string

const (
	TypeEmail  NotificationType = "email"
	TypeSlack  NotificationType = "slack"
	TypeNtfy   NotificationType = "ntfy"
	TypeStdout NotificationType = "stdout"
)

// NotificationStatus represents the current state of a notification
type NotificationStatus string

const (
	StatusPending    NotificationStatus = "pending"
	StatusQueued     NotificationStatus = "queued"
	StatusProcessing NotificationStatus = "processing"
	StatusSent       NotificationStatus = "sent"
	StatusFailed     NotificationStatus = "failed"
	StatusRetrying   NotificationStatus = "retrying"
)

// Notification represents a notification message with metadata
type Notification struct {
	// ID is a unique identifier for the notification
	ID string `json:"id"`

	// Type specifies which notifier should handle this notification
	Type NotificationType `json:"type"`

	// Priority determines urgency and retry behavior
	Priority Priority `json:"priority"`

	// Status tracks the current state of the notification
	Status NotificationStatus `json:"status"`

	// Subject is the notification subject/title (used for email, slack, ntfy)
	Subject string `json:"subject"`

	// Body is the main content of the notification
	Body string `json:"body"`

	// Recipients contains the target addresses (email, slack channel, ntfy topic, etc.)
	Recipients []string `json:"recipients"`

	// Metadata contains additional provider-specific data
	Metadata map[string]interface{} `json:"metadata,omitempty"`

	// CreatedAt is when the notification was created
	CreatedAt time.Time `json:"created_at"`

	// ScheduledFor allows delayed sending (optional)
	ScheduledFor *time.Time `json:"scheduled_for,omitempty"`

	// SentAt is when the notification was successfully sent
	SentAt *time.Time `json:"sent_at,omitempty"`

	// RetryCount tracks how many times sending has been attempted
	RetryCount int `json:"retry_count"`

	// MaxRetries defines the maximum retry attempts
	MaxRetries int `json:"max_retries"`

	// LastError stores the most recent error message if failed
	LastError string `json:"last_error,omitempty"`
}

// NotificationResult represents the outcome of sending a notification
type NotificationResult struct {
	// NotificationID references the original notification
	NotificationID string `json:"notification_id"`

	// Success indicates if the notification was sent successfully
	Success bool `json:"success"`

	// Message provides additional context about the result
	Message string `json:"message,omitempty"`

	// Error contains error details if the notification failed
	Error string `json:"error,omitempty"`

	// SentAt is when the notification was sent
	SentAt time.Time `json:"sent_at"`

	// ProviderResponse contains raw response data from the notification provider
	ProviderResponse map[string]interface{} `json:"provider_response,omitempty"`
}

// NotificationFilter is used for querying notifications
type NotificationFilter struct {
	IDs        []string             `json:"ids,omitempty"`
	Types      []NotificationType   `json:"types,omitempty"`
	Statuses   []NotificationStatus `json:"statuses,omitempty"`
	Recipients []string             `json:"recipients,omitempty"`
	CreatedAfter  *time.Time        `json:"created_after,omitempty"`
	CreatedBefore *time.Time        `json:"created_before,omitempty"`
	Limit      int                  `json:"limit,omitempty"`
	Offset     int                  `json:"offset,omitempty"`
}
