using System.Globalization; using WordVersioning.Api.Models; namespace WordVersioning.Api.Services; /// FR-10/FR-16 — validate required + type ของค่าที่กรอก (ใช้ร่วมทั้ง generate และ generate-draft) /// field ที่ส่งเกินนิยาม ignore ตาม policy เดียวกับ FR-11 public static class TemplateFieldValidation { /// null = ผ่าน; ไม่ null = ข้อความ error สำหรับ BadRequest (รูปแบบเดียวกับที่เคยอยู่ใน Generate) public static string? Validate(IEnumerable fieldDefs, IReadOnlyDictionary values) { var missingRequired = fieldDefs .Where(f => f.IsRequired && (!values.TryGetValue(f.Key, out var v) || string.IsNullOrWhiteSpace(v ?? string.Empty))) .Select(f => f.Key) .ToList(); if (missingRequired.Count > 0) return $"กรอก required fields ให้ครบ: {string.Join(", ", missingRequired)}"; var typeErrors = new List(); foreach (var def in fieldDefs) { if (!values.TryGetValue(def.Key, out var v) || string.IsNullOrWhiteSpace(v)) continue; var valid = def.Type switch { "number" => decimal.TryParse(v, NumberStyles.Number, CultureInfo.InvariantCulture, out _), "date" => DateTimeOffset.TryParse(v, CultureInfo.InvariantCulture, DateTimeStyles.None, out _), _ => true, }; if (!valid) typeErrors.Add(def.Type == "number" ? $"`{def.Key}` ต้องเป็นตัวเลข" : $"`{def.Key}` ต้องเป็นวันที่ที่ parse ได้ (ISO-8601 เช่น 2026-08-19)"); } return typeErrors.Count > 0 ? string.Join("; ", typeErrors) : null; } }