namespace BomLocalService.Models; /// /// Response model containing all radar screenshot frames and associated metadata. /// This is the primary response returned when requesting a radar screenshot for a location. /// public class RadarResponse { /// /// List of all captured frames (typically 7 frames: 0-6). /// Each frame contains an absoluteObservationTime UTC timestamp. /// Client should calculate "minutes ago" dynamically from the timestamp. /// public List Frames { get; set; } = new(); /// /// The UTC timestamp when the screenshot file was last written/modified on disk. /// This is the file system modification time, which typically matches when the screenshot was captured. /// Used as a fallback if metadata is not available. /// public DateTime LastUpdated { get; set; } /// /// The UTC timestamp when the weather observations were taken (from BOM website). /// This comes from the LastUpdatedInfo metadata extracted from the BOM weather map page. /// BOM updates observations every 15 minutes (at :00, :15, :30, :45 past the hour). /// If metadata is not available, defaults to DateTime.UtcNow. /// public DateTime ObservationTime { get; set; } /// /// The UTC timestamp when the weather forecast was generated (from BOM website). /// This comes from the LastUpdatedInfo metadata extracted from the BOM weather map page. /// Forecasts are typically updated less frequently than observations. /// If metadata is not available, defaults to DateTime.UtcNow. /// public DateTime ForecastTime { get; set; } /// /// The name of the weather station providing the observations for this location. /// Extracted from the BOM website metadata (e.g., "Gympie", "Brisbane"). /// May be null if the station name cannot be parsed or if metadata is not available. /// public string? WeatherStation { get; set; } /// /// The distance from the requested location to the weather station. /// Extracted from the BOM website metadata (e.g., "30 km", "15 km"). /// Format: "{number} km". /// May be null if the distance cannot be parsed or if metadata is not available. /// public string? Distance { get; set; } /// /// Indicates whether the cached data is still considered valid based on its observation time /// and the configured cache expiration period. /// public bool CacheIsValid { get; set; } /// /// The UTC date and time when the current cached data is expected to expire. /// This is calculated based on the observation time and a configured buffer (e.g., 15.5 minutes). /// Null if cache is not valid or metadata is not available. /// public DateTime? CacheExpiresAt { get; set; } /// /// Indicates whether a cache update is currently in progress for this location. /// When true, clients should wait before requesting a refresh, as a new cache is being generated. /// public bool IsUpdating { get; set; } /// /// The UTC date and time when the next cache update is expected or recommended. /// - If cache is valid: equals (check again when cache expires). /// - If cache is invalid and an update is in progress: estimated completion time (approximately 2 minutes from now). /// - If cache is invalid and no update is in progress: null (client should trigger an update). /// This may differ from when an update is actively in progress. /// public DateTime? NextUpdateTime { get; set; } }