package mailer

import (
	"encoding/base64"
	"fmt"
	"mime"
	"net/smtp"
	"strconv"
)

type Mailer struct {
	Host     string `json:"host,omitempty"`
	Port     int    `json:"port,omitempty"`
	Username string `json:"username,omitempty"`
	Password string `json:"password,omitempty"`
	From     string `json:"from,omitempty"`
}

func (m *Mailer) Ready() bool {
	return m.Host != "" && m.Port != 0 && m.Username != "" && m.Password != "" && m.From != ""
}

func (m *Mailer) server() string {
	return m.Host + ":" + strconv.Itoa(m.Port)
}

func (m *Mailer) Send(msg *Message) error {
	server := m.server()

	header := make(map[string]string)
	header["From"] = msg.From.String()
	header["To"] = msg.To.String()
	header["Subject"] = mime.QEncoding.Encode("UTF-8", msg.Subject)
	header["MIME-Version"] = "1.0"
	header["Content-Type"] = "text/html; charset=\"utf-8\""
	header["Content-Transfer-Encoding"] = "base64"

	message := ""
	for k, v := range header {
		message += fmt.Sprintf("%s: %s\r\n", k, v)
	}
	message += "\r\n" + base64.StdEncoding.EncodeToString([]byte(msg.Body))

	return smtp.SendMail(
		server,
		smtp.PlainAuth("", m.Username, m.Password, m.Host),
		m.From,
		[]string{msg.To.Address},
		[]byte(message),
	)
}
