// 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 Application.Ringtoets.Storage.Create.IllustrationPoints;
using Application.Ringtoets.Storage.DbContext;
using Core.Common.Utils.Extensions;
using Ringtoets.Common.Data.Hydraulics;
using Ringtoets.Common.Data.IllustrationPoints;
namespace Application.Ringtoets.Storage.Create
{
///
/// Extension methods for related to creating a .
///
internal static class HydraulicBoundaryLocationCreateExtensions
{
///
/// Creates a based on the information of the .
///
/// The location to create a database entity for.
/// The object keeping track of create operations.
/// Index at which this instance resides inside its parent container.
/// A new .
/// Thrown when is null.
internal static HydraulicLocationEntity Create(this HydraulicBoundaryLocation location, PersistenceRegistry registry, int order)
{
if (registry == null)
{
throw new ArgumentNullException(nameof(registry));
}
if (registry.Contains(location))
{
return registry.Get(location);
}
var entity = new HydraulicLocationEntity
{
LocationId = location.Id,
Name = location.Name.DeepClone(),
LocationX = location.Location.X.ToNaNAsNull(),
LocationY = location.Location.Y.ToNaNAsNull(),
ShouldDesignWaterLevelIllustrationPointsBeCalculated = GetShouldIllustrationPointsBeCalculated(location.DesignWaterLevelCalculation),
ShouldWaveHeightIllustrationPointsBeCalculated = GetShouldIllustrationPointsBeCalculated(location.WaveHeightCalculation),
Order = order
};
CreateHydraulicLocationOutput(entity, location.DesignWaterLevelCalculation.Output, HydraulicLocationOutputType.DesignWaterLevel);
CreateHydraulicLocationOutput(entity, location.WaveHeightCalculation.Output, HydraulicLocationOutputType.WaveHeight);
registry.Register(entity, location);
return entity;
}
private static byte GetShouldIllustrationPointsBeCalculated(HydraulicBoundaryLocationCalculation calculation)
{
return Convert.ToByte(calculation.InputParameters.ShouldIllustrationPointsBeCalculated);
}
private static void CreateHydraulicLocationOutput(HydraulicLocationEntity entity, HydraulicBoundaryLocationOutput output,
HydraulicLocationOutputType outputType)
{
if (output != null)
{
var hydraulicLocationOutputEntity = output.Create(outputType);
CreateGeneralResultSubMechanismIllustrationPoint(hydraulicLocationOutputEntity,
output.GeneralResult);
entity.HydraulicLocationOutputEntities.Add(hydraulicLocationOutputEntity);
}
}
private static void CreateGeneralResultSubMechanismIllustrationPoint(IHydraulicLocationOutputEntity entity,
GeneralResult illustrationPoint)
{
if (illustrationPoint != null)
{
entity.GeneralResultSubMechanismIllustrationPointEntity =
illustrationPoint.CreateGeneralResultSubMechanismIllustrationPointEntity();
}
}
#region Grass CoverErosion Outwards HydraulicLocation
///
/// Creates a based on the information of the .
///
/// The location to create a database entity for.
/// The object keeping track of create operations.
/// Index at which this instance resides inside its parent container.
/// A new .
/// Thrown when is null.
internal static GrassCoverErosionOutwardsHydraulicLocationEntity CreateGrassCoverErosionOutwardsHydraulicBoundaryLocation(
this HydraulicBoundaryLocation location, PersistenceRegistry registry, int order)
{
if (registry == null)
{
throw new ArgumentNullException(nameof(registry));
}
if (registry.Contains(location))
{
return registry.Get(location);
}
var entity = new GrassCoverErosionOutwardsHydraulicLocationEntity
{
LocationId = location.Id,
Name = location.Name.DeepClone(),
LocationX = location.Location.X.ToNaNAsNull(),
LocationY = location.Location.Y.ToNaNAsNull(),
ShouldDesignWaterLevelIllustrationPointsBeCalculated = GetShouldIllustrationPointsBeCalculated(location.DesignWaterLevelCalculation),
ShouldWaveHeightIllustrationPointsBeCalculated = GetShouldIllustrationPointsBeCalculated(location.WaveHeightCalculation),
Order = order
};
CreateGrassCoverErosionOutwardsHydraulicLocationOutput(entity, location.DesignWaterLevelCalculation.Output,
HydraulicLocationOutputType.DesignWaterLevel);
CreateGrassCoverErosionOutwardsHydraulicLocationOutput(entity, location.WaveHeightCalculation.Output,
HydraulicLocationOutputType.WaveHeight);
registry.Register(entity, location);
return entity;
}
private static void CreateGrassCoverErosionOutwardsHydraulicLocationOutput(GrassCoverErosionOutwardsHydraulicLocationEntity entity,
HydraulicBoundaryLocationOutput output,
HydraulicLocationOutputType outputType)
{
if (output != null)
{
var grassCoverErosionOutwardsHydraulicLocationOutputEntity =
output.Create(outputType);
CreateGeneralResultSubMechanismIllustrationPoint(grassCoverErosionOutwardsHydraulicLocationOutputEntity,
output.GeneralResult);
entity.GrassCoverErosionOutwardsHydraulicLocationOutputEntities.Add(grassCoverErosionOutwardsHydraulicLocationOutputEntity);
}
}
#endregion
}
}