117 lines
3.9 KiB
C#
117 lines
3.9 KiB
C#
namespace MyBiz.Core;
|
||
|
||
/// <summary>
|
||
/// Реестр типов продуктов - центрлизованное хранилище конфигураций
|
||
/// Поддерживает моддинг через загрузку внешних конфигураций
|
||
/// </summary>
|
||
public class ProductRegistry
|
||
{
|
||
private readonly Dictionary<string, ProductType> _productTypes = new();
|
||
|
||
/// <summary>
|
||
/// Все зарегистрированные типы продуктов
|
||
/// </summary>
|
||
public IEnumerable<ProductType> AllProductTypes => _productTypes.Values;
|
||
|
||
/// <summary>
|
||
/// Количество зарегистрированных типов
|
||
/// </summary>
|
||
public int Count => _productTypes.Count;
|
||
|
||
/// <summary>
|
||
/// Событие: добавлен новый тип продукта (для моддинга)
|
||
/// </summary>
|
||
public event Action<ProductType>? ProductTypeAdded;
|
||
|
||
/// <summary>
|
||
/// Событие: изменён тип продукта
|
||
/// </summary>
|
||
public event Action<ProductType>? ProductTypeModified;
|
||
|
||
/// <summary>
|
||
/// Зарегистрировать тип продукта
|
||
/// </summary>
|
||
public void Register(ProductType productType)
|
||
{
|
||
if (string.IsNullOrEmpty(productType.Id))
|
||
throw new ArgumentException("Product type must have an Id", nameof(productType));
|
||
|
||
if (_productTypes.ContainsKey(productType.Id))
|
||
throw new InvalidOperationException($"Product type '{productType.Id}' is already registered");
|
||
|
||
_productTypes[productType.Id] = productType;
|
||
ProductTypeAdded?.Invoke(productType);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Получить тип продукта по ID
|
||
/// </summary>
|
||
public ProductType? GetById(string id)
|
||
{
|
||
return _productTypes.TryGetValue(id, out var type) ? type : null;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Получить тип продукта или выбросить исключение
|
||
/// </summary>
|
||
public ProductType GetOrThrow(string id)
|
||
{
|
||
return GetById(id) ?? throw new KeyNotFoundException($"Product type '{id}' not found");
|
||
}
|
||
|
||
/// <summary>
|
||
/// Проверка: существует ли тип продукта
|
||
/// </summary>
|
||
public bool Exists(string id)
|
||
{
|
||
return _productTypes.ContainsKey(id);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Получить продукты по категории
|
||
/// </summary>
|
||
public IEnumerable<ProductType> GetByCategory(ProductCategory category)
|
||
{
|
||
return _productTypes.Values.Where(p => p.Category == category);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Получить продукты, доступные в указанном году
|
||
/// </summary>
|
||
public IEnumerable<ProductType> GetAvailableInYear(int year)
|
||
{
|
||
return _productTypes.Values.Where(p => p.AvailableFromYear <= year);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Удалить тип продукта (для моддинга)
|
||
/// </summary>
|
||
public bool Remove(string id)
|
||
{
|
||
if (_productTypes.Remove(id))
|
||
{
|
||
ProductTypeModified?.Invoke(new ProductType { Id = id });
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Загрузить типы продуктов из конфигурации (JSON и т.п.)
|
||
/// </summary>
|
||
public void LoadFromConfig(string jsonConfig)
|
||
{
|
||
// TODO: Реализовать загрузку из JSON
|
||
// Это позволит модам добавлять свои продукты
|
||
}
|
||
|
||
/// <summary>
|
||
/// Экспортировать все типы в JSON (для моддинга)
|
||
/// </summary>
|
||
public string ExportToJson()
|
||
{
|
||
// TODO: Реализовать экспорт в JSON
|
||
return "{}";
|
||
}
|
||
}
|