// Copyright (C) Stichting Deltares 2018. All rights reserved.
//
// This file is part of Ringtoets.
//
// Ringtoets is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
//
// All names, logos, and references to "Deltares" are registered trademarks of
// Stichting Deltares and remain full property of Stichting Deltares at all times.
// All rights reserved.
using System;
using System.Collections.Generic;
using System.Linq;
using Ringtoets.ClosingStructures.Data;
using Ringtoets.Common.Data.FailureMechanism;
using Ringtoets.DuneErosion.Data;
using Ringtoets.GrassCoverErosionInwards.Data;
using Ringtoets.GrassCoverErosionOutwards.Data;
using Ringtoets.HeightStructures.Data;
using Ringtoets.Integration.Data.StandAlone;
using Ringtoets.Integration.Data.StandAlone.AssemblyFactories;
using Ringtoets.Integration.Data.StandAlone.SectionResults;
using Ringtoets.MacroStabilityInwards.Data;
using Ringtoets.Piping.Data;
using Ringtoets.StabilityPointStructures.Data;
using Ringtoets.StabilityStoneCover.Data;
using Ringtoets.WaveImpactAsphaltCover.Data;
using Riskeer.AssemblyTool.Data;
namespace Ringtoets.Integration.Data.Assembly
{
///
/// Factory that creates instances.
///
internal static class CombinedAssemblyFailureMechanismSectionFactory
{
///
/// Creates a collection of collections.
///
/// The assessment section to use.
/// The failure mechanisms to build input for.
/// Indicator that determines whether the manual assembly should be considered when assembling the result.
/// A collection of collections.
/// Thrown when any parameter is null.
public static IEnumerable> CreateInput(AssessmentSection assessmentSection,
IEnumerable failureMechanisms,
bool useManual)
{
if (assessmentSection == null)
{
throw new ArgumentNullException(nameof(assessmentSection));
}
if (failureMechanisms == null)
{
throw new ArgumentNullException(nameof(failureMechanisms));
}
var inputs = new List>();
PipingFailureMechanism pipingFailureMechanism = assessmentSection.Piping;
if (failureMechanisms.Contains(pipingFailureMechanism))
{
inputs.Add(CreateCombinedSections(pipingFailureMechanism.SectionResults,
assessmentSection, PipingAssemblyFunc, useManual));
}
GrassCoverErosionInwardsFailureMechanism grassCoverErosionInwardsFailureMechanism = assessmentSection.GrassCoverErosionInwards;
if (failureMechanisms.Contains(grassCoverErosionInwardsFailureMechanism))
{
inputs.Add(CreateCombinedSections(grassCoverErosionInwardsFailureMechanism.SectionResults,
assessmentSection, GrassCoverErosionInwardsAssemblyFunc, useManual));
}
MacroStabilityInwardsFailureMechanism macroStabilityInwardsFailureMechanism = assessmentSection.MacroStabilityInwards;
if (failureMechanisms.Contains(macroStabilityInwardsFailureMechanism))
{
inputs.Add(CreateCombinedSections(macroStabilityInwardsFailureMechanism.SectionResults,
assessmentSection, MacroStabilityInwardsAssemblyFunc, useManual));
}
MacroStabilityOutwardsFailureMechanism macroStabilityOutwardsFailureMechanism = assessmentSection.MacroStabilityOutwards;
if (failureMechanisms.Contains(macroStabilityOutwardsFailureMechanism))
{
inputs.Add(CreateCombinedSections(macroStabilityOutwardsFailureMechanism.SectionResults,
assessmentSection, MacroStabilityOutwardsAssemblyFunc, useManual));
}
MicrostabilityFailureMechanism microstabilityFailureMechanism = assessmentSection.Microstability;
if (failureMechanisms.Contains(microstabilityFailureMechanism))
{
inputs.Add(CreateCombinedSections(microstabilityFailureMechanism.SectionResults,
MicrostabilityAssemblyFunc, useManual));
}
StabilityStoneCoverFailureMechanism stabilityStoneCoverFailureMechanism = assessmentSection.StabilityStoneCover;
if (failureMechanisms.Contains(stabilityStoneCoverFailureMechanism))
{
inputs.Add(CreateCombinedSections(stabilityStoneCoverFailureMechanism.SectionResults,
StabilityStoneCoverAssemblyFunc, useManual));
}
WaveImpactAsphaltCoverFailureMechanism waveImpactAsphaltCoverFailureMechanism = assessmentSection.WaveImpactAsphaltCover;
if (failureMechanisms.Contains(waveImpactAsphaltCoverFailureMechanism))
{
inputs.Add(CreateCombinedSections(waveImpactAsphaltCoverFailureMechanism.SectionResults,
WaveImpactAsphaltCoverAssemblyFunc, useManual));
}
WaterPressureAsphaltCoverFailureMechanism waterPressureAsphaltCoverFailureMechanism = assessmentSection.WaterPressureAsphaltCover;
if (failureMechanisms.Contains(waterPressureAsphaltCoverFailureMechanism))
{
inputs.Add(CreateCombinedSections(waterPressureAsphaltCoverFailureMechanism.SectionResults,
WaterPressureAsphaltCoverAssemblyFunc, useManual));
}
GrassCoverErosionOutwardsFailureMechanism grassCoverErosionOutwardsFailureMechanism = assessmentSection.GrassCoverErosionOutwards;
if (failureMechanisms.Contains(grassCoverErosionOutwardsFailureMechanism))
{
inputs.Add(CreateCombinedSections(grassCoverErosionOutwardsFailureMechanism.SectionResults,
GrassCoverErosionOutwardsAssemblyFunc, useManual));
}
GrassCoverSlipOffOutwardsFailureMechanism grassCoverSlipOffOutwardsFailureMechanism = assessmentSection.GrassCoverSlipOffOutwards;
if (failureMechanisms.Contains(grassCoverSlipOffOutwardsFailureMechanism))
{
inputs.Add(CreateCombinedSections(grassCoverSlipOffOutwardsFailureMechanism.SectionResults,
GrassCoverSlipOffOutwardsAssemblyFunc, useManual));
}
GrassCoverSlipOffInwardsFailureMechanism grassCoverSlipOffInwardsFailureMechanism = assessmentSection.GrassCoverSlipOffInwards;
if (failureMechanisms.Contains(grassCoverSlipOffInwardsFailureMechanism))
{
inputs.Add(CreateCombinedSections(grassCoverSlipOffInwardsFailureMechanism.SectionResults,
GrassCoverSlipOffInwardsAssemblyFunc, useManual));
}
HeightStructuresFailureMechanism heightStructuresFailureMechanism = assessmentSection.HeightStructures;
if (failureMechanisms.Contains(heightStructuresFailureMechanism))
{
inputs.Add(CreateCombinedSections(heightStructuresFailureMechanism.SectionResults,
assessmentSection, HeightStructuresAssemblyFunc, useManual));
}
ClosingStructuresFailureMechanism closingStructuresFailureMechanism = assessmentSection.ClosingStructures;
if (failureMechanisms.Contains(closingStructuresFailureMechanism))
{
inputs.Add(CreateCombinedSections(closingStructuresFailureMechanism.SectionResults,
assessmentSection, ClosingStructuresAssemblyFunc, useManual));
}
PipingStructureFailureMechanism pipingStructureFailureMechanism = assessmentSection.PipingStructure;
if (failureMechanisms.Contains(pipingStructureFailureMechanism))
{
inputs.Add(CreateCombinedSections(pipingStructureFailureMechanism.SectionResults,
PipingStructureAssemblyFunc, useManual));
}
StabilityPointStructuresFailureMechanism stabilityPointStructuresFailureMechanism = assessmentSection.StabilityPointStructures;
if (failureMechanisms.Contains(stabilityPointStructuresFailureMechanism))
{
inputs.Add(CreateCombinedSections(stabilityPointStructuresFailureMechanism.SectionResults,
assessmentSection, StabilityPointStructuresAssemblyFunc, useManual));
}
StrengthStabilityLengthwiseConstructionFailureMechanism strengthStabilityLengthwiseConstructionFailureMechanism = assessmentSection.StrengthStabilityLengthwiseConstruction;
if (failureMechanisms.Contains(strengthStabilityLengthwiseConstructionFailureMechanism))
{
inputs.Add(CreateCombinedSections(strengthStabilityLengthwiseConstructionFailureMechanism.SectionResults,
StrengthStabilityLengthwiseConstructionAssemblyFunc, useManual));
}
DuneErosionFailureMechanism duneErosionFailureMechanism = assessmentSection.DuneErosion;
if (failureMechanisms.Contains(duneErosionFailureMechanism))
{
inputs.Add(CreateCombinedSections(duneErosionFailureMechanism.SectionResults,
DuneErosionAssemblyFunc, useManual));
}
TechnicalInnovationFailureMechanism technicalInnovationFailureMechanism = assessmentSection.TechnicalInnovation;
if (failureMechanisms.Contains(technicalInnovationFailureMechanism))
{
inputs.Add(CreateCombinedSections(technicalInnovationFailureMechanism.SectionResults,
TechnicalInnovationAssemblyFunc, useManual));
}
return inputs;
}
private static IEnumerable CreateCombinedSections(
IEnumerable sectionResults,
AssessmentSection assessmentSection,
Func getAssemblyFunc,
bool useManual)
where TFailureMechanismSectionResult : FailureMechanismSectionResult
{
double totalSectionsLength = 0;
return sectionResults.Select(sectionResult =>
{
CombinedAssemblyFailureMechanismSection section = CreateSection(sectionResult,
getAssemblyFunc(sectionResult,
assessmentSection,
useManual),
totalSectionsLength);
totalSectionsLength = section.SectionEnd;
return section;
})
.ToArray();
}
private static IEnumerable CreateCombinedSections(
IEnumerable sectionResults,
Func getAssemblyFunc,
bool useManual)
where TFailureMechanismSectionResult : FailureMechanismSectionResult
{
double totalSectionsLength = 0;
return sectionResults.Select(sectionResult =>
{
CombinedAssemblyFailureMechanismSection section = CreateSection(sectionResult, getAssemblyFunc(sectionResult, useManual), totalSectionsLength);
totalSectionsLength = section.SectionEnd;
return section;
})
.ToArray();
}
private static CombinedAssemblyFailureMechanismSection CreateSection(
TFailureMechanismSectionResult sectionResult, FailureMechanismSectionAssemblyCategoryGroup assemblyCategoryGroup,
double sectionStart)
where TFailureMechanismSectionResult : FailureMechanismSectionResult
{
double sectionEnd = sectionResult.Section.Length + sectionStart;
return new CombinedAssemblyFailureMechanismSection(sectionStart, sectionEnd, assemblyCategoryGroup);
}
#region Assembly Funcs
private static Func PipingAssemblyFunc
{
get
{
return (sectionResult, assessmentSection, useManual) => PipingFailureMechanismAssemblyFactory.GetSectionAssemblyCategoryGroup(
sectionResult, assessmentSection.Piping, assessmentSection, useManual);
}
}
private static Func GrassCoverErosionInwardsAssemblyFunc
{
get
{
return (sectionResult, assessmentSection, useManual) => GrassCoverErosionInwardsFailureMechanismAssemblyFactory.GetSectionAssemblyCategoryGroup(
sectionResult, assessmentSection.GrassCoverErosionInwards, assessmentSection, useManual);
}
}
private static Func MacroStabilityInwardsAssemblyFunc
{
get
{
return (sectionResult, assessmentSection, useManual) => MacroStabilityInwardsFailureMechanismAssemblyFactory.GetSectionAssemblyCategoryGroup(
sectionResult, assessmentSection.MacroStabilityInwards, assessmentSection, useManual);
}
}
private static Func MacroStabilityOutwardsAssemblyFunc
{
get
{
return (sectionResult, assessmentSection, useManual) => MacroStabilityOutwardsFailureMechanismAssemblyFactory.GetSectionAssemblyCategoryGroup(
sectionResult, assessmentSection.MacroStabilityOutwards, assessmentSection, useManual);
}
}
private static Func MicrostabilityAssemblyFunc
{
get
{
return MicrostabilityFailureMechanismAssemblyFactory.GetSectionAssemblyCategoryGroup;
}
}
private static Func StabilityStoneCoverAssemblyFunc
{
get
{
return StabilityStoneCoverFailureMechanismAssemblyFactory.GetSectionAssemblyCategoryGroup;
}
}
private static Func WaveImpactAsphaltCoverAssemblyFunc
{
get
{
return WaveImpactAsphaltCoverFailureMechanismAssemblyFactory.GetSectionAssemblyCategoryGroup;
}
}
private static Func WaterPressureAsphaltCoverAssemblyFunc
{
get
{
return WaterPressureAsphaltCoverFailureMechanismAssemblyFactory.GetSectionAssemblyCategoryGroup;
}
}
private static Func GrassCoverErosionOutwardsAssemblyFunc
{
get
{
return GrassCoverErosionOutwardsFailureMechanismAssemblyFactory.GetSectionAssemblyCategoryGroup;
}
}
private static Func GrassCoverSlipOffOutwardsAssemblyFunc
{
get
{
return GrassCoverSlipOffOutwardsFailureMechanismAssemblyFactory.GetSectionAssemblyCategoryGroup;
}
}
private static Func GrassCoverSlipOffInwardsAssemblyFunc
{
get
{
return GrassCoverSlipOffInwardsFailureMechanismAssemblyFactory.GetSectionAssemblyCategoryGroup;
}
}
private static Func HeightStructuresAssemblyFunc
{
get
{
return (sectionResult, assessmentSection, useManual) => HeightStructuresFailureMechanismAssemblyFactory.GetSectionAssemblyCategoryGroup(
sectionResult, assessmentSection.HeightStructures, assessmentSection, useManual);
}
}
private static Func ClosingStructuresAssemblyFunc
{
get
{
return (sectionResult, assessmentSection, useManual) => ClosingStructuresFailureMechanismAssemblyFactory.GetSectionAssemblyCategoryGroup(
sectionResult, assessmentSection.ClosingStructures, assessmentSection, useManual);
}
}
private static Func PipingStructureAssemblyFunc
{
get
{
return PipingStructureFailureMechanismAssemblyFactory.GetSectionAssemblyCategoryGroup;
}
}
private static Func StabilityPointStructuresAssemblyFunc
{
get
{
return (sectionResult, assessmentSection, useManual) => StabilityPointStructuresFailureMechanismAssemblyFactory.GetSectionAssemblyCategoryGroup(
sectionResult, assessmentSection.StabilityPointStructures, assessmentSection, useManual);
}
}
private static Func StrengthStabilityLengthwiseConstructionAssemblyFunc
{
get
{
return StrengthStabilityLengthwiseConstructionFailureMechanismAssemblyFactory.GetSectionAssemblyCategoryGroup;
}
}
private static Func DuneErosionAssemblyFunc
{
get
{
return DuneErosionFailureMechanismAssemblyFactory.GetSectionAssemblyCategoryGroup;
}
}
private static Func TechnicalInnovationAssemblyFunc
{
get
{
return TechnicalInnovationFailureMechanismAssemblyFactory.GetSectionAssemblyCategoryGroup;
}
}
#endregion
}
}