using System;
namespace ZB.MOM.WW.LmxOpcUa.Host.Domain
{
///
/// Value-Timestamp-Quality triplet for tag data. (MXA-003, OPC-007)
///
public readonly struct Vtq : IEquatable
{
public object? Value { get; }
public DateTime Timestamp { get; }
public Quality Quality { get; }
public Vtq(object? value, DateTime timestamp, Quality quality)
{
Value = value;
Timestamp = timestamp;
Quality = quality;
}
public static Vtq Good(object? value) => new Vtq(value, DateTime.UtcNow, Quality.Good);
public static Vtq Bad(Quality quality = Quality.Bad) => new Vtq(null, DateTime.UtcNow, quality);
public static Vtq Uncertain(object? value) => new Vtq(value, DateTime.UtcNow, Quality.Uncertain);
public bool Equals(Vtq other) =>
Equals(Value, other.Value) && Timestamp == other.Timestamp && Quality == other.Quality;
public override bool Equals(object? obj) => obj is Vtq other && Equals(other);
public override int GetHashCode() => HashCode.Combine(Value, Timestamp, Quality);
public override string ToString() => $"Vtq({Value}, {Timestamp:O}, {Quality})";
}
}