package arn

import (
	"encoding/json"
	"net/http"

	webpush "github.com/akyoto/webpush-go"
)

// PushSubscription ...
type PushSubscription struct {
	Platform  string `json:"platform"`
	UserAgent string `json:"userAgent"`
	Screen    struct {
		Width  int `json:"width"`
		Height int `json:"height"`
	} `json:"screen"`
	Endpoint    string `json:"endpoint" private:"true"`
	P256DH      string `json:"p256dh" private:"true"`
	Auth        string `json:"auth" private:"true"`
	Created     string `json:"created"`
	LastSuccess string `json:"lastSuccess"`
}

// ID ...
func (sub *PushSubscription) ID() string {
	return sub.Endpoint
}

// SendNotification ...
func (sub *PushSubscription) SendNotification(notification *PushNotification) (*http.Response, error) {
	// Define endpoint and security tokens
	s := webpush.Subscription{
		Endpoint: sub.Endpoint,
		Keys: webpush.Keys{
			P256dh: sub.P256DH,
			Auth:   sub.Auth,
		},
	}

	// Create notification
	data, err := json.Marshal(notification)

	if err != nil {
		return nil, err
	}

	// Send Notification
	return webpush.SendNotification(data, &s, &webpush.Options{
		Subscriber:      APIKeys.VAPID.Subject,
		TTL:             60,
		VAPIDPrivateKey: APIKeys.VAPID.PrivateKey,
	})
}
