package requests

import (
	"strings"
	"time"

	"github.com/NdoleStudio/httpsms/pkg/entities"

	"github.com/nyaruka/phonenumbers"

	"github.com/NdoleStudio/httpsms/pkg/services"
)

// MessageSend is the payload for sending and SMS message
type MessageSend struct {
	request
	From    string `json:"from" example:"+18005550199"`
	To      string `json:"to" example:"+18005550100"`
	Content string `json:"content" example:"This is a sample text message"`

	// Attachments are optional. When you provide a list of attachments, the message will be sent out as an MMS
	Attachments []string `json:"attachments" validate:"optional" example:"https://example.com/image.jpg,https://example.com/video.mp4"`

	// Encrypted is an optional parameter used to determine if the content is end-to-end encrypted. Make sure to set the encryption key on the httpSMS mobile app
	Encrypted bool `json:"encrypted" example:"false" validate:"optional"`
	// RequestID is an optional parameter used to track a request from the client's perspective
	RequestID string `json:"request_id" example:"153554b5-ae44-44a0-8f4f-7bbac5657ad4" validate:"optional"`
	// SendAt is an optional parameter used to schedule a message to be sent in the future. The time is considered to be in your profile's local timezone and you can queue messages for up to 20 days (480 hours) in the future.
	SendAt *time.Time `json:"send_at" example:"2025-12-19T16:39:57-08:00" validate:"optional"`
}

// Sanitize sets defaults to MessageReceive
func (input *MessageSend) Sanitize() MessageSend {
	input.To = input.sanitizeAddress(input.To)
	input.RequestID = strings.TrimSpace(input.RequestID)
	input.From = input.sanitizeAddress(input.From)
	var attachments []string
	for _, attachment := range input.Attachments {
		if strings.TrimSpace(attachment) != "" {
			attachments = append(attachments, strings.TrimSpace(attachment))
		}
	}
	input.Attachments = attachments
	return *input
}

// ToMessageSendParams converts MessageSend to services.MessageSendParams
func (input *MessageSend) ToMessageSendParams(userID entities.UserID, source string) services.MessageSendParams {
	from, _ := phonenumbers.Parse(input.From, phonenumbers.UNKNOWN_REGION)
	return services.MessageSendParams{
		Source:            source,
		Owner:             from,
		Encrypted:         input.Encrypted,
		RequestID:         input.sanitizeStringPointer(input.RequestID),
		UserID:            userID,
		SendAt:            input.SendAt,
		RequestReceivedAt: time.Now().UTC(),
		Contact:           input.sanitizeAddress(input.To),
		Content:           input.Content,
		Attachments:       input.Attachments,
	}
}
