using StructureHelperCommon.Infrastructures.Exceptions; using StructureHelperCommon.Infrastructures.Interfaces; using StructureHelperCommon.Models; using StructureHelperCommon.Models.Calculators; using StructureHelperCommon.Services; using StructureHelperLogics.Models.BeamShears; namespace DataAccess.DTOs { public class HasBeamShearCalculatorToDTOConvertStrategy : IUpdateStrategy { private Dictionary<(Guid id, Type type), ISaveable> referenceDictionary; private IShiftTraceLogger traceLogger; public HasBeamShearCalculatorToDTOConvertStrategy(Dictionary<(Guid id, Type type), ISaveable> referenceDictionary, IShiftTraceLogger traceLogger) { this.referenceDictionary = referenceDictionary; this.traceLogger = traceLogger; } public void Update(IHasCalculators targetObject, IHasCalculators sourceObject) { CheckObject.IsNull(targetObject); CheckObject.IsNull(sourceObject); if (ReferenceEquals(targetObject, sourceObject)) { return; } CheckObject.IsNull(sourceObject.Calculators); CheckObject.IsNull(targetObject.Calculators); targetObject.Calculators.Clear(); List calculators = GetCalculators(sourceObject.Calculators); targetObject.Calculators.AddRange(calculators); } private List GetCalculators(IEnumerable sourceCalculators) { List calculators = new(); foreach (var calculator in sourceCalculators) { ICalculator newCalculator = ProcessCalculator(calculator); calculators.Add(newCalculator); } return calculators; } private ICalculator ProcessCalculator(ICalculator calculator) { if (calculator is IBeamShearCalculator shearCalculator) { return ProcessShearCalculator(shearCalculator); } else { throw new StructureHelperException(ErrorStrings.ObjectTypeIsUnknownObj(calculator)); } } private ICalculator ProcessShearCalculator(IBeamShearCalculator shearCalculator) { traceLogger?.AddMessage("Calcultor is beam shear calculator", TraceLogStatuses.Debug); var convertStrategy = new DictionaryConvertStrategy (referenceDictionary, traceLogger, new BeamShearCalculatorToDTOConvertStrategy(referenceDictionary, traceLogger)); return convertStrategy.Convert(shearCalculator); } } }