package mailv2

import (
	"context"

	"github.com/mailgun/mailgun-go/v4"
	"github.com/tidbcloud/pkgv2/log"
	"go.uber.org/zap"
)

var (
	_ Facade = &mailgunProvider{}
)

type mailgunProvider struct {
	mailgunCli mailgun.Mailgun
}

func NewMailgun(mailgunCli mailgun.Mailgun) *mailgunProvider {
	return &mailgunProvider{
		mailgunCli: mailgunCli,
	}
}

func (m *mailgunProvider) SendMailWithTemplateID(ctx context.Context, to []string, subject, templateID string, vars map[string]string, opts *SendMailOpts) error {
	return m.SendMailWithTemplate(ctx, to, subject, templateID, vars, opts)
}

func (m *mailgunProvider) SendMailWithTemplate(ctx context.Context, to []string, subject, templateName string, vars map[string]string, opts *SendMailOpts) error {
	logger := log.WithContextL(ctx).With(zap.String("mailProvider", "mailgun"))
	if opts == nil {
		opts = NewDefaultSendMailOpts()
	}
	logger.Sugar().Infof("try to send email, templateName=%s,to=%s", templateName, to)
	clearedTos := make([]string, 0, len(to))
	for _, each := range to {
		if each != "" {
			clearedTos = append(clearedTos, each)
		}
	}
	if len(clearedTos) == 0 {
		return nil
	}
	to = clearedTos

	message := m.mailgunCli.NewMessage(
		opts.FromAddr,
		subject,
		"",
		to...,
	)
	for _, each := range opts.CC {
		message.AddCC(each)
	}
	message.SetTracking(opts.Track)
	message.SetDeliveryTime(opts.DeliveryTime)
	message.SetTemplate(templateName)
	for k, v := range vars {
		_ = message.AddTemplateVariable(k, v)
	}
	for _, attach := range opts.Attachments {
		message.AddBufferAttachment(attach.Filename, attach.Data)
	}
	logger.Sugar().Infof("try to send email, templateName=%s,len(to)=%d,len(cc)=%d", templateName, len(to), len(opts.CC))
	respMsg, respId, err := m.mailgunCli.Send(ctx, message)
	logger.Sugar().Infof("email sent. msg=%s,respId=%s,err=%s", respMsg, respId, err)
	return err
}
