package contract

import "github.com/google/uuid"

type TriggerNotificationRequest struct {
	UserID       uuid.UUID              `json:"user_id" validate:"required"`
	TemplateID   string                 `json:"template_id" validate:"required"`
	TemplateData map[string]interface{} `json:"template_data,omitempty"`
	To           *NotificationTo        `json:"to,omitempty"`
	Overrides    *NotificationOverrides `json:"overrides,omitempty"`
}

type NotificationTo struct {
	Email        string `json:"email,omitempty"`
	Phone        string `json:"phone,omitempty"`
	SubscriberID string `json:"subscriber_id,omitempty"`
}

type NotificationOverrides struct {
	Email   *EmailOverride   `json:"email,omitempty"`
	SMS     *SMSOverride     `json:"sms,omitempty"`
	InApp   *InAppOverride   `json:"in_app,omitempty"`
	Push    *PushOverride    `json:"push,omitempty"`
	Chat    *ChatOverride    `json:"chat,omitempty"`
}

type EmailOverride struct {
	Subject string `json:"subject,omitempty"`
	Body    string `json:"body,omitempty"`
	From    string `json:"from,omitempty"`
}

type SMSOverride struct {
	Content string `json:"content,omitempty"`
	From    string `json:"from,omitempty"`
}

type InAppOverride struct {
	Content string `json:"content,omitempty"`
}

type PushOverride struct {
	Title   string `json:"title,omitempty"`
	Content string `json:"content,omitempty"`
}

type ChatOverride struct {
	Content string `json:"content,omitempty"`
}

type TriggerNotificationResponse struct {
	Success       bool   `json:"success"`
	TransactionID string `json:"transaction_id,omitempty"`
	Message       string `json:"message,omitempty"`
}

type BulkTriggerNotificationRequest struct {
	TemplateID   string                   `json:"template_id" validate:"required"`
	UserIDs      []uuid.UUID              `json:"user_ids" validate:"required,min=1"`
	TemplateData map[string]interface{}   `json:"template_data,omitempty"`
	Overrides    *NotificationOverrides   `json:"overrides,omitempty"`
}

type BulkTriggerNotificationResponse struct {
	Success       bool                     `json:"success"`
	TotalSent     int                      `json:"total_sent"`
	TotalFailed   int                      `json:"total_failed"`
	Results       []NotificationResult     `json:"results,omitempty"`
}

type NotificationResult struct {
	UserID        uuid.UUID `json:"user_id"`
	Success       bool      `json:"success"`
	TransactionID string    `json:"transaction_id,omitempty"`
	Error         string    `json:"error,omitempty"`
}

type GetSubscriberRequest struct {
	UserID uuid.UUID `json:"user_id" validate:"required"`
}

type GetSubscriberResponse struct {
	SubscriberID string                 `json:"subscriber_id"`
	Email        string                 `json:"email"`
	FirstName    string                 `json:"first_name"`
	LastName     string                 `json:"last_name"`
	Phone        string                 `json:"phone,omitempty"`
	Avatar       string                 `json:"avatar,omitempty"`
	Data         map[string]interface{} `json:"data,omitempty"`
	Channels     []ChannelCredentials   `json:"channels,omitempty"`
}

type ChannelCredentials struct {
	Channel      string                 `json:"channel"`
	Credentials  map[string]interface{} `json:"credentials"`
}

type UpdateSubscriberChannelRequest struct {
	UserID      uuid.UUID              `json:"user_id" validate:"required"`
	Channel     string                 `json:"channel" validate:"required,oneof=email sms push chat in_app"`
	Credentials map[string]interface{} `json:"credentials" validate:"required"`
}

type UpdateSubscriberChannelResponse struct {
	Success bool   `json:"success"`
	Message string `json:"message,omitempty"`
}