package email

import (
	"crypto/tls"
	"github.com/civet148/log"
	"gopkg.in/gomail.v2"
)

const (
	SubjectVerificationCodeForRegister      = "Complete your registration with your Jelly AI verification Code"
	SubjectVerificationCodeForResetPassword = "Complete your reset with your Jelly AI verification Code"
)

type EmailConfig struct {
	SmtpServer string `json:"smtp_server" db:"smtp_server"`
	SmtpPort   uint32 `json:"smtp_port" db:"smtp_port"`
	SmtpName   string `json:"smtp_name" db:"smtp_name"`
	AuthCode   string `json:"auth_code" db:"auth_code"`
	SendName   string `json:"send_name" db:"send_name"`
}

func SendVerificationCode(cfg *EmailConfig, subject, to, body string) (err error) {

	m := gomail.NewMessage()

	//发送人
	m.SetAddressHeader("From", cfg.SmtpName, cfg.SendName)
	//接收人
	m.SetHeader("To", to)
	//主题
	m.SetHeader("Subject", subject)
	//内容
	m.SetBody("text/html", body)
	//附件
	//m.Attach("./myIpPic.png")
	d := gomail.NewDialer(cfg.SmtpServer, int(cfg.SmtpPort), cfg.SmtpName, cfg.AuthCode)
	if d.TLSConfig == nil {
		d.TLSConfig = &tls.Config{
			InsecureSkipVerify: true,
		}
	} else {
		d.TLSConfig.InsecureSkipVerify = true
	}

	// 发送邮件
	if err = d.DialAndSend(m); err != nil {
		log.Errorf("Send mail failed,err: %s", err.Error())
		return err
	}
	log.Debugf("send to mail [%s] body [%s]", to, body)
	return nil
}

func SendEmail(cfg *EmailConfig, subject string, msg string, to string) (err error) {
	log.Debugf("[SMTP] server [%s] port [%v] name [%s] to [%s]", cfg.SmtpServer, cfg.SmtpPort, cfg.SmtpName, to)
	if to == "" {
		return log.Errorf("no recipient to send")
	}
	log.Debugf("send email subject [%s] to %+v ", subject, to)

	m := gomail.NewMessage()

	//发送人
	m.SetAddressHeader("From", cfg.SmtpName, cfg.SendName)
	//接收人
	m.SetHeader("To", to)
	//抄送
	//m.SetHeader("Cc", to...)
	//密送
	//m.SetHeader("Bcc", to...)
	//主题
	m.SetHeader("Subject", subject)
	//内容
	m.SetBody("text/html", msg)
	//附件
	//m.Attach("./myIpPic.png")
	d := gomail.NewDialer(cfg.SmtpServer, int(cfg.SmtpPort), cfg.SmtpName, cfg.AuthCode)
	if d.TLSConfig == nil {
		d.TLSConfig = &tls.Config{
			InsecureSkipVerify: true,
		}
	} else {
		d.TLSConfig.InsecureSkipVerify = true
	}
	// 发送邮件
	if err = d.DialAndSend(m); err != nil {
		log.Errorf("send email error [%s]", err.Error())
		return err
	}
	return nil
}

func SendEmailBcc(cfg *EmailConfig, subject string, msg string, to ...string) (err error) {
	log.Debugf("[SMTP] server [%s] port [%v] name [%s] to %v", cfg.SmtpServer, cfg.SmtpPort, cfg.SmtpName, to)
	if len(to) == 0 {
		return log.Errorf("no bcc recipients to send")
	}
	log.Debugf("send email subject [%s] to %+v ", subject, to)

	m := gomail.NewMessage()

	//发送人
	m.SetAddressHeader("From", cfg.SmtpName, cfg.SendName)
	//接收人
	m.SetHeader("To", cfg.SmtpName)
	//抄送
	//m.SetHeader("Cc", to...)
	//密送
	m.SetHeader("Bcc", to...)
	//主题
	m.SetHeader("Subject", subject)
	//内容
	m.SetBody("text/html", msg)
	//附件
	//m.Attach("./myIpPic.png")
	d := gomail.NewDialer(cfg.SmtpServer, int(cfg.SmtpPort), cfg.SmtpName, cfg.AuthCode)

	// 发送邮件
	if err = d.DialAndSend(m); err != nil {
		log.Errorf("send email error [%s]", err.Error())
		return err
	}
	return nil
}
