package fm

import (
	"crypto/tls"
	"errors"
	"fmt"
	"strings"

	"be.ems/lib/dborm"
	"be.ems/lib/log"
	"be.ems/restagent/config"

	"gopkg.in/gomail.v2"
)

func AlarmEmailForward(alarmData *Alarm) error {
	log.Info("AlarmEmailForward processing... ")

	message := fmt.Sprintf(`
	<p>Alarm information</p>
		<p style="text-indent:2.5em">Sequence: %d</p>
		<p style="text-indent:3em">NE name: %s</p>
		<p style="text-indent:4em">Title: %s</p>
		<p style="text-indent:2.5em">Severity: %s</p>
		<p style="text-indent:1.5em">Event Time: %s</p>
		<p style="text-indent:0.5em">Alarm Status: %d</p>
	<p>Automatic sent by OMC, please do not reply!</p>
	`, alarmData.AlarmSeq, alarmData.NeName, alarmData.AlarmTitle, alarmData.OrigSeverity, alarmData.EventTime, alarmData.AlarmStatus)

	// message := fmt.Sprintf(`
	// Alarm information

	//       Sequence: %d
	// 	   NE name: %s
	//          Title: %s
	//       Severity: %s
	//     Event Time: %s

	//    Automatic send by OMC, don't reply!
	// `, alarmData.AlarmSeq, alarmData.NeName, alarmData.AlarmTitle, alarmData.OrigSeverity, alarmData.EventTime)

	// QQ 邮箱：
	// SMTP 服务器地址：smtp.qq.com（SSL协议端口：465/994 | 非SSL协议端口：25）
	// 163 邮箱：
	// SMTP 服务器地址：smtp.163.com（端口：25）
	// host := "mail.agrandtech.com"
	// port := 25
	// userName := "smtpext@agrandtech.com"
	// password := "1000smtp@omc!"

	host := config.GetYamlConfig().Alarm.Email.Smtp
	port := int(config.GetYamlConfig().Alarm.Email.Port)
	userName := config.GetYamlConfig().Alarm.Email.User
	password := config.GetYamlConfig().Alarm.Email.Password

	m := gomail.NewMessage()
	m.SetHeader("From", userName) // 发件人
	//m.SetHeader("From", "alias"+"<"+"aliastest"+">") // 增加发件人别名

	emails, err := dborm.XormGetAlarmForward("Email")
	if err != nil {
		log.Error("Failed to XormGetAlarmForward:", err)
		return err
	} else if emails == nil || len(*emails) == 0 {
		err := errors.New("not found forward email list")
		log.Error(err)
		return err
	}

	forwardLog := &dborm.AlarmForwardLog{
		NeType:     alarmData.NeType,
		NeID:       alarmData.NeId,
		AlarmID:    alarmData.AlarmId,
		AlarmTitle: alarmData.AlarmTitle,
		AlarmSeq:   alarmData.AlarmSeq,
		EventTime:  alarmData.EventTime,
		ToUser:     strings.Join(*emails, ","),
	}

	m.SetHeader("To", *emails...) // 收件人，可以多个收件人，但必须使用相同的 SMTP 连接
	//m.SetHeader("To", strings.Join(*emails, " ")) // 收件人，可以多个收件人，但必须使用相同的 SMTP 连接
	//m.SetHeader("To", "zhangshuzhong@agrandtech.com", "simonzhangsz@outlook.com") // 收件人，可以多个收件人，但必须使用相同的 SMTP 连接
	//m.SetHeader("Cc", "******@qq.com")                  // 抄送，可以多个
	//m.SetHeader("Bcc", "******@qq.com")                 // 暗送，可以多个
	m.SetHeader("Subject", "Alarm from OMC!") // 邮件主题

	// text/html 的意思是将文件的 content-type 设置为 text/html 的形式，浏览器在获取到这种文件时会自动调用html的解析器对文件进行相应的处理。
	// 可以通过 text/html 处理文本格式进行特殊处理，如换行、缩进、加粗等等
	//m.SetBody("text/html", fmt.Sprintf(message, *alarm))
	m.SetBody("text/html", message)

	// text/plain的意思是将文件设置为纯文本的形式，浏览器在获取到这种文件时并不会对其进行处理
	//m.SetBody("text/plain", message)
	// m.Attach("test.sh")   // 附件文件，可以是文件，照片，视频等等
	// m.Attach("lolcatVideo.mp4") // 视频
	// m.Attach("lolcat.jpg") // 照片

	d := gomail.NewDialer(
		host,
		port,
		userName,
		password,
	)
	// 关闭SSL协议认证
	d.TLSConfig = &tls.Config{InsecureSkipVerify: true}
	if !config.GetYamlConfig().Alarm.Email.TlsSkipVerify {
		// 打开SSL协议认证
		d.TLSConfig = &tls.Config{InsecureSkipVerify: false}
	}

	if err := d.DialAndSend(m); err != nil {
		operResult := fmt.Sprintf("Failed to DialAndSend:%v", err)
		log.Error(operResult)
		forwardLog.OperResult = operResult
		affected, err := dborm.XormInsertAlarmForwardLog(forwardLog)
		if err != nil && affected <= 0 {
			log.Error("Failed to insert data:", err)
		}
		return err
	}

	forwardLog.OperResult = "Email sent successfully!"
	affected, err := dborm.XormInsertAlarmForwardLog(forwardLog)
	if err != nil && affected <= 0 {
		log.Error("Failed to insert data:", err)
		return err
	}
	return nil
}
