package templates

import (
	"fmt"
	"html"
	"strings"

	"github.com/caos/zitadel/internal/domain"
	"github.com/caos/zitadel/internal/i18n"
	iam_model "github.com/caos/zitadel/internal/iam/model"
)

const (
	defaultFont            = "http://fonts.googleapis.com/css?family=Lato:200,300,400,600"
	defaultFontFamily      = "-apple-system, BlinkMacSystemFont, Segoe UI, Lato, Arial, Helvetica, sans-serif"
	defaultLogo            = "https://static.zitadel.ch/zitadel-logo-dark@3x.png"
	defaultFontColor       = "#22292f"
	defaultBackgroundColor = "#fafafa"
	defaultPrimaryColor    = "#5282C1"
)

type TemplateData struct {
	Title           string
	PreHeader       string
	Subject         string
	Greeting        string
	Text            string
	Href            string
	ButtonText      string
	PrimaryColor    string
	BackgroundColor string
	FontColor       string
	LogoURL         string
	FontURL         string
	FontFamily      string

	IncludeFooter bool
	FooterText    string
}

func (data *TemplateData) Translate(translator *i18n.Translator, msgType string, args map[string]interface{}, langs ...string) {
	data.Title = translator.Localize(fmt.Sprintf("%s.%s", msgType, domain.MessageTitle), args, langs...)
	data.PreHeader = translator.Localize(fmt.Sprintf("%s.%s", msgType, domain.MessagePreHeader), args, langs...)
	data.Subject = translator.Localize(fmt.Sprintf("%s.%s", msgType, domain.MessageSubject), args, langs...)
	data.Greeting = translator.Localize(fmt.Sprintf("%s.%s", msgType, domain.MessageGreeting), args, langs...)
	data.Text = html.UnescapeString(translator.Localize(fmt.Sprintf("%s.%s", msgType, domain.MessageText), args, langs...))
	data.ButtonText = translator.Localize(fmt.Sprintf("%s.%s", msgType, domain.MessageButtonText), args, langs...)
	data.FooterText = translator.Localize(fmt.Sprintf("%s.%s", msgType, domain.MessageFooterText), args, langs...)
}

func GetTemplateData(translator *i18n.Translator, translateArgs map[string]interface{}, apiDomain, href, msgType, lang string, policy *iam_model.LabelPolicyView) TemplateData {
	templateData := TemplateData{
		Href:            href,
		PrimaryColor:    defaultPrimaryColor,
		BackgroundColor: defaultBackgroundColor,
		FontColor:       defaultFontColor,
		LogoURL:         defaultLogo,
		FontURL:         defaultFont,
		FontFamily:      defaultFontFamily,
		IncludeFooter:   false,
	}
	templateData.Translate(translator, msgType, translateArgs, lang)
	if policy.PrimaryColor != "" {
		templateData.PrimaryColor = policy.PrimaryColor
	}
	if policy.BackgroundColor != "" {
		templateData.BackgroundColor = policy.BackgroundColor
	}
	if policy.FontColor != "" {
		templateData.FontColor = policy.FontColor
	}
	if apiDomain == "" {
		return templateData
	}
	templateData.LogoURL = ""
	if policy.LogoURL != "" {
		templateData.LogoURL = fmt.Sprintf("%s/assets/v1/%s/%s", apiDomain, policy.AggregateID, policy.LogoURL)
	}
	if policy.FontURL != "" {
		split := strings.Split(policy.FontURL, "/")
		templateData.FontFamily = split[len(split)-1] + "," + defaultFontFamily
		templateData.FontURL = fmt.Sprintf("%s/assets/v1/%s/%s", apiDomain, policy.AggregateID, policy.FontURL)
	}
	return templateData
}