package template

import (
	"github.com/matcornic/hermes/v2"
)

// ==============================
// Email 結構定義
// ==============================

// EmailTemplate 代表 Email 樣板
type EmailTemplate struct {
	Title string
	Body  string
}

// ProductInfo 包含產品相關的資訊
type ProductInfo struct {
	Name      string
	Link      string
	Logo      string
	Copyright string
}

// EmailBodyContent 包含郵件正文的資訊
type EmailBodyContent struct {
	RecipientName string
	Intros        []string
	Actions       []hermes.Action
	Outros        []string
	Signature     string
}

// EmailContentParams 組成 Email 內容的參數
type EmailContentParams struct {
	Product ProductInfo
	Content EmailBodyContent
}

// ==============================
// Email 內容產生器
// ==============================

// GenerateEmailBody 根據參數產生 Email HTML 內容
func GenerateEmailBody(params EmailContentParams) (string, error) {
	product := hermes.Product{
		Name:      params.Product.Name,
		Link:      params.Product.Link,
		Logo:      params.Product.Logo,
		Copyright: params.Product.Copyright,
	}

	body := hermes.Body{
		Name:      params.Content.RecipientName,
		Intros:    params.Content.Intros,
		Actions:   params.Content.Actions,
		Outros:    params.Content.Outros,
		Signature: params.Content.Signature,
	}

	h := hermes.Hermes{Product: product}
	email := hermes.Email{Body: body}

	return h.GenerateHTML(email)
}

// GenerateEmailContent 生成 Email 內容（可用於不同驗證類型）
func GenerateEmailContent(title string, intros []string) (EmailTemplate, error) {
	req := EmailContentParams{
		Product: ProductInfo{
			Name:      ProductName,
			Link:      ProductLink,
			Logo:      ProductLogo,
			Copyright: ProductCopyright,
		},
		Content: EmailBodyContent{
			RecipientName: "{{.Username}}",
			Intros:        intros,
			Actions: []hermes.Action{
				{
					Instructions: "請複製您的驗證碼，到網頁重置",
					InviteCode:   "{{.VerifyCode}}",
				},
			},
			Outros: []string{
				"如果您沒有請求此操作，請忽略此郵件。",
			},
			Signature: "",
		},
	}

	emailBody, err := GenerateEmailBody(req)
	if err != nil {
		return EmailTemplate{}, err
	}

	return EmailTemplate{
		Title: title,
		Body:  emailBody,
	}, nil
}

// ==============================
// Email 產生函數
// ==============================

// GenerateForgetPasswordEmailZHTW 生成繁體中文的忘記密碼驗證信
func GenerateForgetPasswordEmailZHTW() (EmailTemplate, error) {
	return GenerateEmailContent("TrueHeart 重設密碼驗證信",
		[]string{"您收到此電子郵件是因為我們收到了針對帳戶的密碼重置請求。"})
}

// GenerateBindingEmailZHTW 生成綁定帳號驗證信
func GenerateBindingEmailZHTW() (EmailTemplate, error) {
	return GenerateEmailContent("TrueHeart 綁定信箱驗證信",
		[]string{"您收到此電子郵件是因為我們收到了針對帳戶的 Email 認證請求。"})
}

// ==============================
// Email 模板對應表
// ==============================

var EmailTemplateMap = map[Language]map[Type]func() (EmailTemplate, error){
	LanguageZhTW: {
		ForgetPasswordVerify: GenerateForgetPasswordEmailZHTW,
		BindingEmail:         GenerateBindingEmailZHTW,
	},
}
