package locales

import (
	pb "git.perx.ru/perxis/perxis-go/proto/locales"
	"golang.org/x/text/language"
)

const (
	DefaultID        = "default" // DefaultID идентификатор локали по умолчанию
	DefaultDirection = "ltr"     // DefaultDirection направление письма по умолчанию
)

type Locale struct {
	ID         string `json:"id" bson:"_id"`                  // Идентификатор локали, генерируется автоматически. Для локали по умолчанию устанавливается как "default".
	SpaceID    string `json:"spaceId" bson:"-"`               // Идентификатор пространства.
	Name       string `json:"name" bson:"name"`               // Название локали. Опционально, заполняется автоматически (Пример: russian, english)
	NativeName string `json:"native_name" bson:"native_name"` // Название локали на языке локали. Опционально, заполняется автоматически (Пример: Русский, English)
	Code       string `json:"code" bson:"code"`               // Код локали https://en.wikipedia.org/wiki/IETF_language_tag
	Fallback   string `json:"fallback" bson:"fallback"`       // Идентификатор локали, который будет использоваться при отсутствии перевода
	Direction  string `json:"direction" bson:"direction"`     // Направление письма - слева направо (ltr) или справа налево (rtl). По умолчанию устанавливается ltr.
	Weight     int    `json:"weight" bson:"weight"`           // Вес локали.
	NoPublish  bool   `json:"no_publish" bson:"no_publish"`   // Не публиковать контент данной локали. Не будет доступен контент через Delivery API. (кроме default)
	Disabled   bool   `json:"disabled" bson:"disabled"`       // Запретить использование локали. Нельзя создавать и редактировать контент для данной локали (кроме default)
}

func (locale *Locale) IsDefault() bool {
	return locale.ID == DefaultID
}

// Возвращает язык локали, например "en", "ru"
func (locale *Locale) GetLanguage() string {
	lang, err := language.Parse(locale.Code)
	if err != nil {
		return ""
	}

	base, _ := lang.Base()
	return base.String()
}

func GetIDs(locales []*Locale) []string {
	result := make([]string, 0, len(locales))
	for _, locale := range locales {
		result = append(result, locale.ID)
	}
	return result
}

func LocaleToProto(locale *Locale) *pb.Locale {
	if locale == nil {
		return nil
	}
	protoLocale := &pb.Locale{
		Id:         locale.ID,
		SpaceId:    locale.SpaceID,
		Name:       locale.Name,
		NativeName: locale.NativeName,
		Code:       locale.Code,
		Fallback:   locale.Fallback,
		Direction:  locale.Direction,
		Weight:     int64(locale.Weight),
		NoPublish:  locale.NoPublish,
		Disabled:   locale.Disabled,
	}
	return protoLocale
}

func LocaleFromProto(protoLocale *pb.Locale) *Locale {
	if protoLocale == nil {
		return nil
	}
	locale := &Locale{
		ID:         protoLocale.Id,
		SpaceID:    protoLocale.SpaceId,
		Name:       protoLocale.Name,
		NativeName: protoLocale.NativeName,
		Code:       protoLocale.Code,
		Fallback:   protoLocale.Fallback,
		Direction:  protoLocale.Direction,
		Weight:     int(protoLocale.Weight),
		NoPublish:  protoLocale.NoPublish,
		Disabled:   protoLocale.Disabled,
	}
	return locale
}