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