// Copyright (C) Stichting Deltares 2017. 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 Core.Common.Base.Data;
using Ringtoets.Common.Data.AssessmentSection;
using Ringtoets.Common.Data.Hydraulics;
namespace Ringtoets.Common.Util
{
///
/// Factory for creating instances.
///
public static class AggregatedHydraulicBoundaryLocationFactory
{
///
/// Creates the aggregated hydraulic boundary locations based on the locations and calculations
/// from an assessment section.
///
/// The assessment section to get the locations and calculations from.
/// An of .
/// Thrown when is null.
public static IEnumerable CreateAggregatedHydraulicBoundaryLocations(IAssessmentSection assessmentSection)
{
if (assessmentSection == null)
{
throw new ArgumentNullException(nameof(assessmentSection));
}
Dictionary waterLevelLookupForFactorizedSignalingNorm =
assessmentSection.WaterLevelCalculationsForFactorizedSignalingNorm.ToDictionary(c => c.HydraulicBoundaryLocation,
c => c);
Dictionary waterLevelLookupForSignalingNorm =
assessmentSection.WaterLevelCalculationsForSignalingNorm.ToDictionary(c => c.HydraulicBoundaryLocation,
c => c);
Dictionary waterLevelLookupForLowerLimitNorm =
assessmentSection.WaterLevelCalculationsForLowerLimitNorm.ToDictionary(c => c.HydraulicBoundaryLocation,
c => c);
Dictionary waterLevelLookupForFactorizedLowerLimitNorm =
assessmentSection.WaterLevelCalculationsForFactorizedLowerLimitNorm.ToDictionary(c => c.HydraulicBoundaryLocation,
c => c);
Dictionary waveHeightLookupForFactorizedSignalingNorm =
assessmentSection.WaveHeightCalculationsForFactorizedSignalingNorm.ToDictionary(c => c.HydraulicBoundaryLocation,
c => c);
Dictionary waveHeightLookupForSignalingNorm =
assessmentSection.WaveHeightCalculationsForSignalingNorm.ToDictionary(c => c.HydraulicBoundaryLocation,
c => c);
Dictionary waveHeightLookupForLowerLimitNorm =
assessmentSection.WaveHeightCalculationsForLowerLimitNorm.ToDictionary(c => c.HydraulicBoundaryLocation,
c => c);
Dictionary waveHeightLookupForFactorizedLowerLimitNorm =
assessmentSection.WaveHeightCalculationsForFactorizedLowerLimitNorm.ToDictionary(c => c.HydraulicBoundaryLocation,
c => c);
return assessmentSection.HydraulicBoundaryDatabase.Locations
.Select(location => new AggregatedHydraulicBoundaryLocation(
location.Id, location.Name, location.Location,
GetCalculationResult(waterLevelLookupForFactorizedSignalingNorm[location].Output),
GetCalculationResult(waterLevelLookupForSignalingNorm[location].Output),
GetCalculationResult(waterLevelLookupForLowerLimitNorm[location].Output),
GetCalculationResult(waterLevelLookupForFactorizedLowerLimitNorm[location].Output),
GetCalculationResult(waveHeightLookupForFactorizedSignalingNorm[location].Output),
GetCalculationResult(waveHeightLookupForSignalingNorm[location].Output),
GetCalculationResult(waveHeightLookupForLowerLimitNorm[location].Output),
GetCalculationResult(waveHeightLookupForFactorizedLowerLimitNorm[location].Output))).ToArray();
}
private static RoundedDouble GetCalculationResult(HydraulicBoundaryLocationOutput output)
{
return output?.Result ?? RoundedDouble.NaN;
}
}
}