using StructureHelperCommon.Infrastructures.Exceptions; using StructureHelperCommon.Infrastructures.Interfaces; using StructureHelperCommon.Services; //Copyright (c) 2025 Redikultsev Evgeny, Ekaterinburg, Russia //All rights reserved. namespace StructureHelperCommon.Models.Forces { public class ForceActionUpdateStrategy : IUpdateStrategy { private IUpdateStrategy forceUpdateStrategy; private IUpdateStrategy pairUpdateStrategy; private IUpdateStrategy factorUpdateStrategy; private IUpdateStrategy forceListUpdateStrategy; private IUpdateStrategy fileCombinationUpdateStrategy; private IUpdateStrategy ForceUpdateStrategy => forceUpdateStrategy ??= new ForceActionBaseUpdateStrategy(); private IUpdateStrategy PairUpdateStrategy => pairUpdateStrategy ??= new ForcePairUpdateStrategy(); private IUpdateStrategy FactorUpdateStrategy => factorUpdateStrategy ??= new ForceFactoredListUpdateStrategy(); private IUpdateStrategy ForceListUpdateStrategy => forceListUpdateStrategy ??= new ForceCombinationListUpdateStrategy(); private IUpdateStrategy FileCombinationUpdateStrategy => fileCombinationUpdateStrategy ??= new ForceCombinationFromFileUpdateStrategy(); public ForceActionUpdateStrategy( IUpdateStrategy forceActionUpdateStrategy, IUpdateStrategy forcePairUpdateStrategy, IUpdateStrategy factorUpdateStrategy, IUpdateStrategy forceListUpdateStrategy, IUpdateStrategy fileCombinationUpdateStrategy) { this.forceUpdateStrategy = forceActionUpdateStrategy; this.pairUpdateStrategy = forcePairUpdateStrategy; this.factorUpdateStrategy = factorUpdateStrategy; this.forceListUpdateStrategy = forceListUpdateStrategy; this.fileCombinationUpdateStrategy = fileCombinationUpdateStrategy; } public ForceActionUpdateStrategy() { } public void Update(IForceAction targetObject, IForceAction sourceObject) { CheckObject.ThrowIfNull(targetObject); CheckObject.ThrowIfNull(sourceObject); if (ReferenceEquals(targetObject, sourceObject)) { return; } ForceUpdateStrategy.Update(targetObject, sourceObject); UpdateChildProperties(targetObject, sourceObject); } private void UpdateChildProperties(IForceAction targetObject, IForceAction sourceObject) { if (sourceObject.GetType() != targetObject.GetType()) { throw new StructureHelperException(ErrorStrings.ExpectedWas(targetObject.GetType(), sourceObject.GetType() + $": source object type is not {targetObject.GetType()}")); } if (targetObject is IDesignForcePair pair) { PairUpdateStrategy.Update(pair, (IDesignForcePair)sourceObject); } else if (targetObject is IForceFactoredList combination) { FactorUpdateStrategy.Update(combination, (IForceFactoredList)sourceObject); } else if (targetObject is IForceCombinationList forceCombinationList) { ForceListUpdateStrategy.Update(forceCombinationList, (IForceCombinationList)sourceObject); } else if (targetObject is IForceCombinationFromFile fileCombination) { FileCombinationUpdateStrategy.Update(fileCombination, (IForceCombinationFromFile)sourceObject); } else { ErrorCommonProcessor.ObjectTypeIsUnknown(typeof(IForceAction), targetObject.GetType()); } } } }