using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using AutoMapper; using WotBlitzStatisticsPro.Common.Dictionaries; using WotBlitzStatisticsPro.Common.Model; using WotBlitzStatisticsPro.DataAccess; using WotBlitzStatisticsPro.DataAccess.Model; using WotBlitzStatisticsPro.WgApiClient; using WotBlitzStatisticsPro.WgApiClient.Model; namespace WotBlitzStatisticsPro.Logic.Dictionaries { public class StaticDictionariesUpdater : IDictionaryUpdater { private readonly IWargamingDictionariesApiClient _wargamingDictionariesApiClient; private readonly IDictionariesDataAccessor _dataAccessor; private readonly IMapper _mapper; [Obsolete("Parameter-less constructor only for unit tests")] public StaticDictionariesUpdater() { _wargamingDictionariesApiClient = null!; _dataAccessor = null!; _mapper = null!; } public StaticDictionariesUpdater( IWargamingDictionariesApiClient wargamingDictionariesApiClient, IDictionariesDataAccessor dataAccessor, IMapper mapper) { _wargamingDictionariesApiClient = wargamingDictionariesApiClient; _dataAccessor = dataAccessor; _mapper = mapper; } public virtual async Task Update() { var ( languages, nations, vehicleTypes, clanRoles, achievementsSections) = await GetAndMapDictionaries(); if(languages != null) { await _dataAccessor.UpdateLanguages(languages); } if(nations != null) { await _dataAccessor.UpdateNations(nations); } if(vehicleTypes != null) { await _dataAccessor.UpdateVehicleTypes(vehicleTypes); } if(clanRoles != null) { await _dataAccessor.UpdateClanRoles(clanRoles); } if(achievementsSections != null) { await _dataAccessor.UpdateAchievementsSections(achievementsSections); } return new UpdateDictionariesResponseItem { DictionaryType = DictionaryType.StaticDictionaries, Description = $"Updated {languages?.Count} items in Languages dictionary; {nations?.Count} items in Nations dictionary; {vehicleTypes?.Count} items in VehicleTypes dictionary; {clanRoles?.Count} items in ClanRoles dictionary; {achievementsSections?.Count} items in AchievementsSections dictionary" }; } private async Task<( List?, List?, List?, List?, List?)> GetAndMapDictionaries() { var defaultRealmType = RealmType.Eu; List? languages = null; var nations = new List(); var vehicleTypes = new List(); var clanRoles = new List(); var achievementsSections = new List(); foreach (var requestLanguage in (RequestLanguage[])Enum.GetValues(typeof(RequestLanguage))) { var (wotEncyclopediaInfoResponse, wotClanMembersDictionaryResponse) = await _wargamingDictionariesApiClient.GetStaticDictionariesAsync(defaultRealmType, requestLanguage); if (wotEncyclopediaInfoResponse?.Languages != null) languages ??= _mapper .Map, List>(wotEncyclopediaInfoResponse.Languages).Cast().ToList(); MapVehicleNations(requestLanguage, wotEncyclopediaInfoResponse?.VehicleNations, nations); MapVehicleTypes(requestLanguage, wotEncyclopediaInfoResponse?.VehicleTypes, vehicleTypes); MapClanRoles(requestLanguage, wotClanMembersDictionaryResponse?.ClanRoles, clanRoles); MapAchievementsSections(requestLanguage, wotEncyclopediaInfoResponse?.AchievementSections, achievementsSections); } return (languages, nations, vehicleTypes, clanRoles, achievementsSections); } private void MapVehicleNations( RequestLanguage requestLanguage, Dictionary? sourceDictionary, List destinationDictionary) { if (sourceDictionary == null) { return; } foreach (var source in sourceDictionary) { var destinationItem = destinationDictionary.FirstOrDefault(d => d.NationId == source.Key); if (destinationItem == null) { destinationItem = new NationDictionary { NationId = source.Key, NationNames = new List() }; destinationDictionary.Add(destinationItem); } destinationItem.NationNames.Add( new LocalizableString {Language = requestLanguage, Value = source.Value}); } } private void MapVehicleTypes( RequestLanguage requestLanguage, Dictionary? sourceDictionary, List destinationDictionary) { if (sourceDictionary == null) { return; } foreach (var source in sourceDictionary) { var destinationItem = destinationDictionary.FirstOrDefault(d => d.VehicleTypeId == source.Key); if (destinationItem == null) { destinationItem = new VehicleTypeDictionary { VehicleTypeId = source.Key, VehicleTypeNames = new List() }; destinationDictionary.Add(destinationItem); } destinationItem.VehicleTypeNames.Add( new LocalizableString { Language = requestLanguage, Value = source.Value }); } } private void MapClanRoles( RequestLanguage requestLanguage, Dictionary? sourceDictionary, List destinationDictionary) { if (sourceDictionary == null) { return; } foreach (var source in sourceDictionary) { var destinationItem = destinationDictionary.FirstOrDefault(d => d.ClanRoleId == source.Key); if (destinationItem == null) { destinationItem = new ClanRoleDictionary { ClanRoleId = source.Key, ClanRoleNames = new List() }; destinationDictionary.Add(destinationItem); } destinationItem.ClanRoleNames.Add( new LocalizableString { Language = requestLanguage, Value = source.Value }); } } private void MapAchievementsSections( RequestLanguage requestLanguage, Dictionary? sourceSections, List destinationDictionary) { if (sourceSections == null) { return; } foreach (var section in sourceSections) { var destinationItem = destinationDictionary.FirstOrDefault(d => d.AchievementSectionId == section.Key); if (destinationItem == null) { destinationItem = new AchievementSectionDictionary { AchievementSectionId = section.Key, Order = Convert.ToInt32(section.Value.Order), AchievementSectionNames = new List() }; destinationDictionary.Add(destinationItem); } destinationItem.AchievementSectionNames.Add( new LocalizableString { Language = requestLanguage, Value = section.Value.Name }); } } } }