using DataAccess.DTOs.Converters; using StructureHelperCommon.Infrastructures.Exceptions; using StructureHelperCommon.Infrastructures.Interfaces; using StructureHelperCommon.Models.Calculators; using StructureHelperLogics.NdmCalculations.Analyses.ValueDiagrams; using StructureHelperLogics.NdmCalculations.Primitives; namespace DataAccess.DTOs { public class ValueDiagramCalculatorInputDataFromDTOConvertStrategy : ConvertStrategy { private IUpdateStrategy updateStrategy; private IConvertStrategy diagramConvertStrategy; private IProcessLogic forcesAndPrimitivesLogic; private IConvertStrategy accuracyConvertStrategy; private IUpdateStrategy UpdateStrategy => updateStrategy ??= new ValueDiagramCalculatorInputDataUpdateStrategy() { UpdateChildren = false }; private IConvertStrategy DiagramConvertStrategy => diagramConvertStrategy ??= new ValueDiagramEntityFromDTOConvertStrategy(this); private IProcessLogic ForcesAndPrimitivesLogic => forcesAndPrimitivesLogic ??= new HasForcesAndPrimitivesProcessLogic(ConvertDirection.FromDTO) { ReferenceDictionary = ReferenceDictionary, TraceLogger = TraceLogger }; private IConvertStrategy AccuracyConvertStrategy => accuracyConvertStrategy ??= new AccuracyFromDTOConvertStrategy() { ReferenceDictionary = ReferenceDictionary, TraceLogger = TraceLogger }; public ValueDiagramCalculatorInputDataFromDTOConvertStrategy(IBaseConvertStrategy baseConvertStrategy) : base(baseConvertStrategy) { } public ValueDiagramCalculatorInputDataFromDTOConvertStrategy( IUpdateStrategy updateStrategy, IConvertStrategy diagramConvertStrategy, IProcessLogic forcesAndPrimitivesLogic, IConvertStrategy accuracyConvertStrategy) { this.updateStrategy = updateStrategy; this.diagramConvertStrategy = diagramConvertStrategy; this.forcesAndPrimitivesLogic = forcesAndPrimitivesLogic; this.accuracyConvertStrategy = accuracyConvertStrategy; } public override ValueDiagramCalculatorInputData GetNewItem(ValueDiagramCalculatorInputDataDTO source) { ChildClass = this; NewItem = new(source.Id); UpdateStrategy.Update(NewItem, source); ProcessForcesAndPrimitives(source); NewItem.Diagrams.Clear(); foreach (var diagram in source.Diagrams) { if (diagram is not ValueDiagramEntityDTO diagramDTO) { throw new StructureHelperException(ErrorStrings.ObjectTypeIsUnknownObj(diagram)); } NewItem.Diagrams.Add(DiagramConvertStrategy.Convert(diagramDTO)); } return NewItem; } private void ProcessForcesAndPrimitives(IHasForcesAndPrimitives source) { ForcesAndPrimitivesLogic.Source = source; ForcesAndPrimitivesLogic.Target = NewItem; ForcesAndPrimitivesLogic.Process(); } } }