using System.Collections;
using Newtonsoft.Json.Linq;
namespace Pf2eModel.Model.Common.I18n;
///
/// Локализованная строка.
///
public class LocaleString : ICollection
{
///
/// Список локализаций строк.
///
private readonly List _items = [];
///
/// Проверяет наличие хотя бы одной локализации.
///
private void AssureDefault()
{
if (_items.Count == 0)
{
_items.Add(new(LocaleType.English, string.Empty));
}
}
///
/// Количество локализаций.
///
public int Count => _items.Count;
///
/// Коллекция реализованных типов локализаций.
///
public ICollection Types => _items.Select(c => c.Locale).ToList();
///
public bool IsReadOnly => false;
///
/// Конструктор класса .
///
public LocaleString()
{
AssureDefault();
}
///
/// Получение типа локализации по строковому представлению.
///
/// Строковое представление.
/// Тип локализации.
private LocaleType _E(string localeString) => localeString.GetTypeByString();
///
/// Получение типа локализации с учётом её наличия в коллекции.
///
/// Искомый тип локализации.
/// Реальный тип локализации.
private LocaleType RealLocale(LocaleType locale) =>
Contains(locale) ? locale : LocaleType.English;
///
/// Получение типа локализации по строковому представлению с учётом её наличия в коллекции.
///
/// Строковое представление искомого типа локализации.
/// Реальный тип локализации.
private LocaleType RealLocale(string localeString) => RealLocale(_E(localeString));
///
/// Получение объекта локализованной строки по типу локализации.
///
/// Искомый тип локализации.
/// Объект локализованной строки.
public LocaleItem GetItem(LocaleType locale) => this.First(c => c.Locale == RealLocale(locale));
///
/// Получение объекта локализованной строки по строковому представлению типа локализации.
///
/// Строковое представление искомого типа локализации.
/// Объект локализованной строки.
public LocaleItem GetItem(string localeString) =>
this.First(c => c.Locale == RealLocale(localeString));
///
/// Получение локализованной строки по типу локализации.
///
/// Искомый тип локализации.
/// Локализованная строка.
public string this[LocaleType locale]
{
get => GetItem(locale).Value;
set
{
if (Types.Contains(locale))
{
GetItem(locale).Value = value;
}
else
{
_items.Add(new(locale, value));
}
}
}
///
/// Получение локализованной строки по типу локализации.
///
/// Строковое представление искомого типа локализации.
/// Локализованная строка.
public string this[string localeString]
{
get => this[_E(localeString)];
set => this[_E(localeString)] = value;
}
///
/// Добавление объекта локализованной строки в коллекцию.
///
/// Объект локализированной строки.
public void Add(LocaleItem item)
{
this[item.Locale] = item.Value;
}
///
/// Добавление локализованной строки в коллекцию.
///
/// Тип локализации.
/// Строка локазации.
public void Add(LocaleType locale, string value)
{
this[locale] = value;
}
///
/// Отчистка коллекции локализованных строк.
///
public void Clear()
{
_items.Clear();
AssureDefault();
}
///
/// Проверка наличия объекта локализованной строки в коллекции.
///
/// Объект локализированной строки.
/// `true`, если объект есть; `false`, если нет.
public bool Contains(LocaleItem item)
{
return _items.Contains(item);
}
///
/// Проверка наличия локализованной строки в коллекции по типу локализации.
///
/// Тип локализации.
/// `true`, если искомый тип локализации есть; `false`, если нет.
public bool Contains(LocaleType locale)
{
return Types.Contains(locale);
}
///
/// Проверка наличия локализованной строки в коллекции по строковому представлению типа локализации.
///
/// Строковое представление искомого типа локализации.
/// `true`, если искомый тип локализации есть; `false`, если нет.
public bool Contains(string localeString)
{
return this.Any(item => item.Value == localeString);
}
///
public void CopyTo(LocaleItem[] array, int arrayIndex)
{
throw new NotImplementedException();
}
///
public bool Remove(LocaleItem item)
{
bool result = _items.Remove(item);
if (Count == 0)
{
AssureDefault();
return false;
}
return result;
}
///
public IEnumerator GetEnumerator()
{
return _items.GetEnumerator();
}
///
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
///
public override string ToString()
{
return this[LocaleType.English];
}
///
/// Сериализация локализованной строки в JSON-формат.
///
/// Строковое представление JSON-представления.
public string Serialize()
{
JObject json = [];
foreach (LocaleItem item in _items)
{
json.Add(item.Locale.GetTypeString(), item.Value);
}
return json.ToString();
}
///
/// Десериализация локализованной строки из JSON-формата.
///
/// Строковое представление JSON-представления.
/// Объект локализованной строки.
public static LocaleString Deserialize(string input)
{
JObject json = JObject.Parse(input);
LocaleString result = [];
foreach (KeyValuePair item in json)
{
result[item.Key] = item.Value?.ToString() ?? "";
}
return result;
}
}