using System.Collections.Immutable; using System.Text.Json; using FurinaImpact.Common.Data.Provider; using Microsoft.Extensions.Logging; namespace FurinaImpact.Common.Data.Binout; public class BinDataCollection { private readonly ImmutableDictionary _avatarConfigs; public BinDataCollection(IAssetProvider assetProvider, ILogger logger, DataHelper dataHelper) { _avatarConfigs = LoadAvatarConfigs(assetProvider, dataHelper); logger.LogInformation("Loaded {count} avatar configs", _avatarConfigs.Count); } public AvatarConfig GetAvatarConfig(uint id) { return _avatarConfigs[id]; } private static ImmutableDictionary LoadAvatarConfigs(IAssetProvider assetProvider, DataHelper dataHelper) { ImmutableDictionary.Builder builder = ImmutableDictionary.CreateBuilder(); IEnumerable avatarConfigFiles = assetProvider.EnumerateAvatarConfigFiles(); foreach (string avatarConfigFile in avatarConfigFiles) { string avatarName = avatarConfigFile[(avatarConfigFile.LastIndexOf('_') + 1)..]; avatarName = avatarName.Remove(avatarName.IndexOf('.')); if (dataHelper.TryResolveAvatarIdByName(avatarName, out uint id)) { JsonDocument configJson = assetProvider.GetFileAsJsonDocument(avatarConfigFile); if (configJson.RootElement.ValueKind != JsonValueKind.Object) throw new JsonException($"BinDataCollection::LoadAvatarConfigs - expected an object, got {configJson.RootElement.ValueKind}"); AvatarConfig avatarConfig = configJson.RootElement.Deserialize()!; builder.Add(id, avatarConfig); } else { throw new KeyNotFoundException($"BinDataCollection::LoadAvatarConfigs - failed to resolve avatar id for {avatarName}"); } } return builder.ToImmutable(); } }