package payments

import (
	"context"
	"encoding/json"
	"fmt"
	"strings"
)

type NotificationParams struct {
	UserID           string
	TransferID       string
	InboundPaymentID string
	Type             string
	Title            string
	Message          string
	Payload          map[string]any
}

func RecordNotification(ctx context.Context, q txer, params NotificationParams) error {
	params.UserID = strings.TrimSpace(params.UserID)
	params.Type = strings.TrimSpace(params.Type)
	params.Title = strings.TrimSpace(params.Title)
	params.Message = strings.TrimSpace(params.Message)
	if params.UserID == "" || params.Type == "" || params.Title == "" || params.Message == "" {
		return fmt.Errorf("payment notification requires user_id, type, title and message")
	}

	payload := []byte(`{}`)
	if params.Payload != nil {
		encoded, err := json.Marshal(params.Payload)
		if err != nil {
			return err
		}
		payload = encoded
	}

	_, err := q.Exec(ctx, `
		INSERT INTO payment_notifications (
			user_id, transfer_id, inbound_payment_id, notification_type, title, message, payload
		)
		VALUES ($1, NULLIF($2, '')::uuid, NULLIF($3, '')::uuid, $4, $5, $6, $7::jsonb)
	`, params.UserID, strings.TrimSpace(params.TransferID), strings.TrimSpace(params.InboundPaymentID),
		params.Type, params.Title, params.Message, string(payload))
	return err
}
