using System.Text.Json; using Backend.DatabaseHandler; using Backend.Interface; namespace Backend.ServiceHander; public sealed class PercentChangeEvaluator : IAlertEvaluator { public string AlertType => "percent_change"; 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 || !snapshot.PreviousClose.HasValue || snapshot.PreviousClose.Value == 0) { return Task.FromResult(new AlertEvaluation { Triggered = false }); } double price = snapshot.LastPrice.Value; double prevClose = snapshot.PreviousClose.Value; double percentChange = (price - prevClose) / prevClose * 100.0; bool triggered = parameters.PercentThreshold >= 0 ? percentChange >= parameters.PercentThreshold : percentChange <= parameters.PercentThreshold; string updatedState = JsonSerializer.Serialize(new { lastPrice = price, percentChange }); return Task.FromResult(new AlertEvaluation { Triggered = triggered, UpdatedLastState = updatedState }); } private sealed class PercentChangeParameters { public double PercentThreshold { get; set; } } }