using C4IT.FASD.Base; using FasdDesktopUi.Basics.Services.RelationService; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using static C4IT.Logging.cLogManager; namespace FasdDesktopUi.Basics.Services.SupportCase { public class SupportCase : ISupportCase { private readonly Dictionary> _caseRelations = new Dictionary>(); //private readonly Lookup _supportCaseDataCache; internal readonly Guid Id; private readonly IRelationService _relationService; public cSupportCaseDataProvider SupportCaseDataProviderArtifact { get; } internal SupportCase(Guid id, IRelationService relationService, cSupportCaseDataProvider supportCaseDataProvider) { Id = id; _relationService = relationService; SupportCaseDataProviderArtifact = supportCaseDataProvider; AddCaseRelations(_relationService?.GetLoadedRelations()); } ~SupportCase() { if (_relationService != null) _relationService.RelationsFound -= HandleRelationsFound; } public void Initialize() { if (_relationService != null) _relationService.RelationsFound += HandleRelationsFound; } public ILookup GetCaseRelations() { try { IEnumerable<(enumFasdInformationClass InformationClass, cF4sdApiSearchResultRelation Relation)> flatList = _caseRelations.SelectMany(i => i.Value.Select(v => (i.Key, v))); return flatList.ToLookup(v => v.InformationClass, v => v.Relation); } catch (Exception ex) { LogException(ex); } return null; } public void AddCaseRelations(ILookup relations) { try { if (relations is null) return; foreach (var relationType in relations) { if (_caseRelations.TryGetValue(relationType.Key, out var caseRelation)) caseRelation = caseRelation.Union(relationType, new SearchResultRelationEqualityComparer()).ToList(); else _caseRelations.Add(relationType.Key, relationType.ToList()); if (SupportCaseDataProviderArtifact?.CaseRelations?.TryGetValue(relationType.Key, out var caseRelations) ?? false) caseRelations = caseRelations.Union(relationType, new SearchResultRelationEqualityComparer()).ToList(); else SupportCaseDataProviderArtifact?.CaseRelations?.Add(relationType.Key, relationType.ToList()); } CaseRelationsAdded?.Invoke(this, new RelationEventArgs() { Relations = relations }); } catch (Exception ex) { LogException(ex); } } public void UpdateSupportCaseDataCache() { throw new NotImplementedException(); } public IEnumerable GetSupportCaseHealthcardData(object identities, object valueAddress) { throw new NotImplementedException(); } private void HandleRelationsFound(object sender, StagedSearchResultRelationsEventArgs e) { AddCaseRelations(e.StagedResultRelations.Relations); if (e.StagedResultRelations.IsComplete) _relationService.RelationsFound -= HandleRelationsFound; } private void AddCaseRelations(IEnumerable relations) => AddCaseRelations(relations?.ToLookup(r => cF4sdIdentityEntry.GetFromSearchResult(r.Type), r => r)); public event EventHandler CaseRelationsAdded; public event EventHandler SupportCaseDataCacheHasChanged; // Lookup for IdentitySet and tables which has been updated private class SearchResultRelationEqualityComparer : IEqualityComparer { public bool Equals(cF4sdApiSearchResultRelation x, cF4sdApiSearchResultRelation y) { return x.isEqual(y); } public int GetHashCode(cF4sdApiSearchResultRelation obj) { return obj.GetHashCode(); } } } }