package mail

import (
	"fmt"
	"time"
)

// VerifyWindow is how long a verification or invitation link stays usable. It
// is stated in the email, so it lives beside the message rather than in the
// caller.
const VerifyWindow = 24 * time.Hour

// SendVerification asks someone to confirm the address they signed up with.
// The link is built from the Sender's PublicURL, because the address of the
// portal is a property of the deployment, not of the call site.
func (s Sender) SendVerification(to, token string) error {
	return s.sendTemplate(to, "", "verification", struct {
		Link     string
		TTLHours int
	}{
		Link:     fmt.Sprintf("%s/verify?token=%s", s.PublicURL, token),
		TTLHours: int(VerifyWindow.Hours()),
	})
}

// SendInvite asks someone to join an existing account and set their own
// password. It names the account, because an unexpected invitation from a
// service you have never used is otherwise indistinguishable from spam.
func (s Sender) SendInvite(to, accountName, token string) error {
	return s.sendTemplate(to, "", "invite", struct {
		AccountName string
		Link        string
	}{
		AccountName: accountName,
		Link:        fmt.Sprintf("%s/accept-invite?token=%s", s.PublicURL, token),
	})
}
