using StructureHelperCommon.Infrastructures.Interfaces; using StructureHelperCommon.Models; using StructureHelperCommon.Models.Calculators; using StructureHelperCommon.Models.Loggers; using StructureHelperLogics.NdmCalculations.Analyses.ByForces.Logics; namespace StructureHelperLogics.NdmCalculations.Analyses.ByForces { public class ForceCalculator : IForceCalculator { private ICheckInputDataLogic? checkInputDataLogic; private IForceCalculatorLogic? forceCalculatorLogic; private IUpdateStrategy? updateStrategy; private ICheckInputDataLogic CheckInputDataLogic => checkInputDataLogic ??= new CheckForceCalculatorInputData(); private IForceCalculatorLogic ForceCalculatorLogic => forceCalculatorLogic ??= new ForceCalculatorLogic(); private IUpdateStrategy UpdateStrategy => updateStrategy ??= new ForceCalculatorUpdateStrategy(); /// public Guid Id { get; } = Guid.NewGuid(); /// public string Name { get; set; } = string.Empty; /// public IForceCalculatorInputData InputData { get; set; } = new ForceCalculatorInputData(); /// public Action ActionToOutputResults { get; set; } /// public IShiftTraceLogger? TraceLogger { get; set; } /// public IResult Result { get; private set; } public bool ShowTraceData { get; set; } public ForceCalculator( ICheckInputDataLogic checkInputDataLogic, IForceCalculatorLogic forceCalculatorLogic, IUpdateStrategy updateStrategy ) { this.checkInputDataLogic = checkInputDataLogic; this.forceCalculatorLogic = forceCalculatorLogic; this.updateStrategy = updateStrategy; } public ForceCalculator(Guid id) { Id = id; } public void Run() { TraceLogger?.AddMessage(LoggerStrings.LogicType(this), TraceLogStatuses.Service); CheckInputDataLogic.InputData = InputData; CheckInputDataLogic.TraceLogger = TraceLogger; if (CheckInputDataLogic.Check() != true) { Result = new ForceCalculatorResult() { IsValid = false, Description = CheckInputDataLogic.CheckResult }; return; } ForceCalculatorLogic.InputData = InputData; if (ActionToOutputResults is not null) { ForceCalculatorLogic.ActionToOutputResults = ActionToOutputResults; } ForceCalculatorLogic.TraceLogger = TraceLogger?.GetSimilarTraceLogger(50); Result = ForceCalculatorLogic.GetForcesResults(); } public object Clone() { var newCalculator = new ForceCalculator(Guid.NewGuid()); UpdateStrategy.Update(newCalculator, this); return newCalculator; } } }