package main
import (
	"errors"
	"fmt"
	"os"
	cfg "mailsrv/config"
	"mailsrv/mail"
	srv "mailsrv/services"
	"github.com/go-kit/kit/log"
	"github.com/go-kit/kit/log/level"
	ini "gopkg.in/ini.v1"
)
const (
	DefaultOutboxPath string = "outbox"
)
// simply collects binary arguments
func GetConfigPath() (string, error) {
	switch len(os.Args) {
	case 1:
		return "", errors.New("mailsrv must have .ini config file as first parameter")
	case 2:
		return os.Args[1], nil
	default:
		return "", errors.New("mailsrv must only have one parameter: .ini path file")
	}
}
func LoadIni() (*ini.File, error) {
	configPath, err := GetConfigPath()
	if err != nil {
		return nil, fmt.Errorf("unable to get the .ini config path err=%v", err)
	}
	ini, err := ini.Load(configPath)
	if err != nil {
		return nil, fmt.Errorf("unable to load the .ini config path err=%v", err)
	}
	return ini, nil
}
// collects mandatory SMTP parameters to send an e-mail from the `.ini` file
func LoadSMTPConfig(iniFile *ini.File) (cfg.SMTPConfig, error) {
	var config cfg.SMTPConfig
	section := iniFile.Section("server")
	config, err := cfg.NewSMTPConfig(
		section.Key("username").String(),
		section.Key("password").String(),
		section.Key("url").String(),
		section.Key("port").String(),
	)
	if err != nil {
		return config, fmt.Errorf("failed to load the SMTP configuration err=%v", err)
	}
	return config, nil
}
// tries to get the outbox path from the `.ini` file and creates the directory
// if the path does not exist, create a default one: `outbox` next to the binary
func GetOutboxPath(iniFile *ini.File) (string, error) {
	outboxPath := iniFile.Section("service").Key("outbox_path").String()
	if outboxPath == "" {
		outboxPath = DefaultOutboxPath
	}
	if err := os.MkdirAll(outboxPath, 0750); err != nil && !os.IsExist(err) {
		return "", err
	}
	return outboxPath, nil
}
func main() {
	var logger log.Logger
	logger = log.NewLogfmtLogger(log.NewSyncWriter(os.Stderr))
	logger = log.With(logger, "ts", log.DefaultTimestampUTC, "caller", log.DefaultCaller, "service", "mailsrv")
	iniFile, err := LoadIni()
	if err != nil {
		level.Error(logger).Log("msg", "unable to load the .ini configuration file", "err", err)
		return
	}
	config, err := LoadSMTPConfig(iniFile)
	if err != nil {
		level.Error(logger).Log("msg", "unable to load the SMTP configuration", "err", err)
		return
	}
	outboxPath, err := GetOutboxPath(iniFile)
	if err != nil {
		level.Error(logger).Log("msg", "unable to retrieve outputbox path", "err", err)
		return
	}
	logger.Log("action", "send email test")
	content := fmt.Sprintf("Hi!
This is an e-mail test, please do not reply.
Thegux Administrator
%s", `