using System.Text.Json;
namespace Admin.NET.Plugin.AiDOP.Service.S8.Rules;
///
/// R2 TIMEOUT 类规则 params_json 解析结果。internal 可见,供测试覆盖。
/// 字段缺失或非法 JSON:调用方负责降级(evaluator 静默返空命中),不在此抛出业务异常。
///
internal sealed class S8TimeoutParams
{
public string? DueAtField { get; set; }
public string? StatusField { get; set; }
public List CompletedStates { get; } = new();
public string? ObjectCodeField { get; set; }
public string? ObjectIdField { get; set; }
public int GraceMinutes { get; set; }
public string? ExceptionTypeCode { get; set; }
/// 解析 params_json;非法 JSON 抛 ,由上游捕获。
public static S8TimeoutParams Parse(string json)
{
using var doc = JsonDocument.Parse(json);
var root = doc.RootElement;
var p = new S8TimeoutParams();
if (root.TryGetProperty("dueAtField", out var v1)) p.DueAtField = v1.GetString();
if (root.TryGetProperty("statusField", out var v2)) p.StatusField = v2.GetString();
if (root.TryGetProperty("objectCodeField", out var v3)) p.ObjectCodeField = v3.GetString();
if (root.TryGetProperty("objectIdField", out var v4)) p.ObjectIdField = v4.GetString();
if (root.TryGetProperty("graceMinutes", out var v5) && v5.ValueKind == JsonValueKind.Number) p.GraceMinutes = v5.GetInt32();
if (root.TryGetProperty("exceptionTypeCode", out var v6)) p.ExceptionTypeCode = v6.GetString();
if (root.TryGetProperty("completedStates", out var v7) && v7.ValueKind == JsonValueKind.Array)
{
foreach (var s in v7.EnumerateArray())
{
var str = s.GetString();
if (!string.IsNullOrWhiteSpace(str)) p.CompletedStates.Add(str!);
}
}
return p;
}
}