/* LabItem.cs
* part of zaaReloaded2
*
* Copyright 2015-2017 Daniel Kraus
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using System.Globalization;
using System.Text.RegularExpressions;
namespace zaaReloaded2.LabModel
{
///
/// Represents a single laboratory item (e.g., sodium or creatinine).
///
public class LabItem
{
#region Properties
///
/// Gets or sets the original name of the item (as known by Lauris).
///
public string Name { get; protected set; }
///
/// Gets or sets the unit of the item (as known by Lauris).
///
public string Unit { get; protected set; }
///
/// Gets or sets the value of the item. This may be a number or a string.
///
public string Value { get; protected set; }
public double NumericalValue
{
get
{
if (IsNumerical)
{
return _numericalValue;
}
else
{
throw new InvalidOperationException(
String.Format("Value '{0}' is not numerical.", Value));
}
}
private set
{
_numericalValue = value;
}
}
public bool IsNumerical
{
get
{
return (Double.TryParse(Value,
NumberStyles.Any,
CultureInfo.InvariantCulture,
out _numericalValue));
}
}
///
/// Returns whether or not the value is an 'extreme' value,
/// i.e. marked with ">" or "<". These values are not
/// strictly numeric, and IsNumerical returns false for them.
///
public bool IsExtreme
{
get
{
return "<>".Contains(Value.Substring(0, 1));
}
}
///
/// Gets the normal value of the item. Need not be set. This is
/// used for items with nominal values (as opposed to numbers).
///
public string Normal { get; protected set; }
///
/// Gets or sets the lower limit of normal.
///
public double LowerLimit
{
get
{
return _lowerLimit;
}
protected set
{
_lowerLimit = value;
HasLowerLimit = true;
}
}
///
/// Is true if the item has a lower limit of normal.
///
public bool HasLowerLimit { get; protected set; }
///
/// Gets or sets the upper limit of normal.
///
public double UpperLimit
{
get
{
return _upperLimit;
}
set
{
_upperLimit = value;
HasUpperLimit = true;
}
}
///
/// Is true if the item has an upper limit of normal.
///
public bool HasUpperLimit { get; protected set; }
///
/// Is true if is normal. Returns true
/// if no limits and no normal value are known.
///
public bool IsNormal
{
get
{
if (IsExtreme) return false;
if (HasLimits)
{
if (HasLowerLimit && HasUpperLimit)
{
return (LowerLimit <= NumericalValue &&
NumericalValue <= UpperLimit);
}
else
{
if (HasLowerLimit)
{
return (LowerLimit <= NumericalValue);
}
return (NumericalValue <= UpperLimit);
}
}
else
{
return String.IsNullOrEmpty(Normal) || (Value == Normal);
}
}
}
///
/// Is true if the item has lower and/or upper limits. Is false if the
/// item does not have limits but a value.
///
public bool HasLimits
{
get { return (HasLowerLimit || HasUpperLimit); }
}
///
/// Is true if the item has numerical limits or a categorical normal
/// value.
///
public bool HasLimitsOrNormal
{
get
{
return HasLimits || !String.IsNullOrEmpty(Normal);
}
}
public bool HasUnit
{
get
{
return !String.IsNullOrEmpty(Unit);
}
}
///
/// Returns the canonical name prefixed with the abbreviation
/// for the material, e.g. "U-Na" for sodium in the spot urine,
/// but only if the material is not blood.
///
public string QualifiedName
{
get
{
switch (Material)
{
case Material.S:
case Material.E:
case Material.B:
return Name;
default:
return String.Format("{0}-{1}", Material.ToString(), Name);
}
}
}
public int PreferredPrecision { get; protected set; }
public bool AlwaysPrintLimits { get; protected set; }
public Material Material { get; protected set; }
///
/// Gets whether the LabItem is marked as blacklisted
/// in the thesaurus.
///
public bool IsBlacklisted { get; protected set; }
///
/// Gets whether the item's label should be suppressed.
///
public bool SuppressLabel { get; protected set; }
#endregion
#region Constructors
public LabItem() { }
///
/// Creates a new LabItem object that has a normal value, but
/// no upper or lower limits. This is constructor is used for
/// testing purposes.
///
public LabItem(string name, string value, string normal)
: this()
{
Name = name;
Value = value;
Normal = normal;
}
#endregion
#region Fields
double _numericalValue;
double _lowerLimit;
double _upperLimit;
#endregion
}
}