package emailer

import (
	"encoding/base64"

	"github.com/sendgrid/sendgrid-go"
	"github.com/sendgrid/sendgrid-go/helpers/mail"
)

type SendgridApiMail struct {
	apiKey   string
	fromName string
	from     string
}

func NewSendgridApiMail(apiKey, fromName, from string) *SendgridApiMail {
	ans := SendgridApiMail{apiKey: apiKey, fromName: fromName, from: from}
	return &ans
}

func (o *SendgridApiMail) Send(toName string, to string, subject string, content string, attachments []Attachment) error {
	m := mail.NewV3Mail()

	mailFrom := mail.NewEmail(o.fromName, o.from)
	mailContent := mail.NewContent("text/html", content)
	mailTo := mail.NewEmail(toName, to)

	m.SetFrom(mailFrom)
	m.AddContent(mailContent)

	personalization := mail.NewPersonalization()
	personalization.AddTos(mailTo)
	personalization.Subject = subject

	m.AddPersonalizations(personalization)

	toAdd := make([]*mail.Attachment, 0, len(attachments))
	for i := range attachments {
		var att mail.Attachment
		encoded := base64.StdEncoding.EncodeToString(attachments[i].Data)
		att.SetContent(encoded)
		att.SetType("text/plain")
		att.SetFilename(attachments[i].Name)
		att.SetDisposition("attachment")
		toAdd = append(toAdd, &att)
	}

	m.AddAttachment(toAdd...)
	request := sendgrid.GetRequest(o.apiKey, "/v3/mail/send", "https://api.sendgrid.com")
	request.Method = "POST"
	request.Body = mail.GetRequestBody(m)
	_, err := sendgrid.API(request)
	return err
}