package main

import (
	"crypto/tls"
	"fmt"
	"github.com/go-mail/mail"
	"os"
)

func main() {
	// Setup config
	fmt.Println("d: parsing config")
	config := NewConfig()
	config.Parse()
	fmt.Printf("%+v\n", config)

	// Get task list as markdown
	fmt.Println("d: configuring trello")
	trelloCtx := NewTrello(config.TrelloApiKey, config.TrelloToken)
	if trelloCtx == nil {
		fmt.Println("ERROR: Unable to initialize trello context")
		os.Exit(1)
	}

	fmt.Println("d: getting trello boards")
	var trelloBoardsList []TrelloBoard
	if len(config.TrelloUrl) > 0 {
		fmt.Printf("d: using given url %s\n", config.TrelloUrl)
		trelloBoard := trelloCtx.GetBoard(config.TrelloUrl)
		trelloBoardsList = append(trelloBoardsList, trelloBoard)
	} else {
		fmt.Println("d: fetching boards")
		trelloBoardsList = trelloCtx.GetBoards()
	}

	for _, trelloBoard := range trelloBoardsList {
		fmt.Printf("d: loading board %s\n", trelloBoard.Name)
		if !trelloBoard.Starred || trelloBoard.Closed {
			fmt.Printf("d: skipping %s\n", trelloBoard.Name)
			continue
		}
		fmt.Printf("d: exporting content of %s\n", trelloBoard.Name)

		trelloMarkdown := trelloBoard.ExportToMarkdown()
		trelloHtml := trelloBoard.ExportToHtml()
		config.EmailSubject = fmt.Sprintf("Daily mail for %s", trelloBoard.Name)

		// Create email enveloppe
		email := mail.NewMessage()
		email.SetHeader("To", config.EmailTo[0])
		if len(config.EmailTo) > 0 {
			email.SetHeader("Cc", config.EmailTo[1:]...)
		}
		email.SetHeader("From", config.EmailFrom)
		email.SetHeader("Subject", config.EmailSubject)
		email.SetBody("text/plain", trelloMarkdown)
		email.AddAlternative("text/html", trelloHtml)

		// Connect and send email
		var transport *mail.Dialer
		if len(config.SmtpUsername) > 0 {
			fmt.Println("d: transport w/ username")
			transport = mail.NewDialer(
				config.SmtpHostname,
				int(config.SmtpPort),
				config.SmtpUsername,
				config.SmtpPassword,
			)
			// disable cert verification
			transport.TLSConfig = &tls.Config{InsecureSkipVerify: true}
		} else {
			fmt.Println("d: transport w/out username")
			transport = &mail.Dialer{
				Host: config.SmtpHostname,
				Port: int(config.SmtpPort),
			}
		}

		if err := transport.DialAndSend(email); err != nil {
			panic(err)
		}
	}
}