// Copyright (c) 2023 Joshua Rich <joshua.rich@gmail.com>
//
// This software is released under the MIT License.
// https://opensource.org/licenses/MIT

package translations

import (
	"github.com/jeandeaual/go-locale"
	"github.com/rs/zerolog/log"
	"golang.org/x/text/language"
	"golang.org/x/text/message"
)

//go:generate gotext -srclang=en update -out=catalog.go -lang=en github.com/joshuar/go-hass-agent

// Translator provides a msgPrinter that can display localised strings for
// translation of the UI
type Translator struct {
	msgPrinter *message.Printer
}

// NewTranslator creates a new Translator in the locale of the system. Strings
// translater by this Translator instance will be localised if a translation is
// available.
func NewTranslator() *Translator {
	t := &Translator{}
	userLocales, err := locale.GetLocales()
	if err != nil {
		log.Warn().Msg("Could not find a suitable locale. Using English.")
		t.msgPrinter = message.NewPrinter(message.MatchLanguage(language.English.String()))
	}
	log.Debug().Msgf("Setting language to %v.", userLocales)
	t.msgPrinter = message.NewPrinter(message.MatchLanguage(userLocales...))
	return t
}

// Translate will take a string defined in English and apply the appropriate
// translation (if available) of the defined Translator.
func (t *Translator) Translate(key string, args ...interface{}) string {
	return t.msgPrinter.Sprintf(key, args...)
}