using System.Text.Json; using Backend.DatabaseHandler; using Backend.Interface; namespace Backend.ServiceHandler; public sealed class PriceThresholdEvaluator : IAlertEvaluator { public string AlertType => "price_threshold"; public Task EvaluateAsync(AlertRecord alert, MarketDataService marketData) { var parameters = JsonSerializer.Deserialize(alert.Parameters) ?? throw new InvalidOperationException($"Invalid parameters for alert {alert.Id}"); var snapshot = marketData.GetLiveQuote(alert.Symbol); if (!snapshot.LastPrice.HasValue) { return Task.FromResult(new AlertEvaluation { Triggered = false }); } double price = snapshot.LastPrice.Value; bool triggered = parameters.Direction.ToLowerInvariant() switch { "above" => price >= parameters.Target, "below" => price <= parameters.Target, _ => false }; string updatedState = JsonSerializer.Serialize(new { lastPrice = price }); return Task.FromResult(new AlertEvaluation { Triggered = triggered, UpdatedLastState = updatedState }); } private sealed class PriceThresholdParameters { public string Direction { get; set; } = string.Empty; public double Target { get; set; } } }