namespace SessionZero.Data; public abstract class SzfObject { public Guid Id { get; set; } = Guid.NewGuid(); public string Name { get; set; } = string.Empty; public string Version { get; set; } = "1.0.0"; public string Description { get; set; } = string.Empty; public string Author { get; set; } = string.Empty; public DateTime CreatedDate { get; set; } = DateTime.UtcNow; public DateTime ModifiedDate { get; set; } = DateTime.UtcNow; public string SchemaVersion { get; set; } = "1.0.0"; public Dictionary ExtendedMetadata { get; set; } = new(); public abstract SzfObjectType ObjectType { get; } public virtual SzfValidationResult Validate() { var result = new SzfValidationResult { IsValid = true }; if (string.IsNullOrWhiteSpace(Name)) result.AddError("Name is required"); if (Id == Guid.Empty) result.AddError("Valid GUID is required"); if (!IsValidSemanticVersion(Version)) result.AddError($"Invalid version format: {Version}"); return result; } /// /// Parse SZF content and auto-detect the type /// public static SzfObject ParseFromSzf(string szfContent) { var parser = new SzfParser(); return parser.Parse(szfContent); } /// /// Parse SZF content into a specific type /// public static T ParseFromSzf(string szfContent) where T : SzfObject { var parser = new SzfParser(); return parser.Parse(szfContent); } public virtual string ToSzfString() { var generator = new SzfGenerator(); return generator.Generate(this); } public virtual void PopulateFromMetadata(Dictionary metadata) { if (metadata.TryGetValue("Name", out var nameField)) Name = nameField.Value?.ToString() ?? string.Empty; if (metadata.TryGetValue("Version", out var versionField)) Version = versionField.Value?.ToString() ?? "1.0.0"; if (metadata.TryGetValue("GUID", out var guidField) && Guid.TryParse(guidField.Value?.ToString(), out var guid)) Id = guid; if (metadata.TryGetValue("Author", out var authorField)) Author = authorField.Value?.ToString() ?? string.Empty; if (metadata.TryGetValue("Description", out var descField)) Description = descField.Value?.ToString() ?? string.Empty; } private static bool IsValidSemanticVersion(string version) { return System.Text.RegularExpressions.Regex.IsMatch( version, @"^\d+\.\d+\.\d+$"); } } public enum SzfObjectType { Dataset, CharacterTemplate, Character, Session } public class SzfValidationResult { public bool IsValid { get; set; } = true; public List Errors { get; set; } = []; public List Warnings { get; set; } = []; public void AddError(string error) { Errors.Add(error); IsValid = false; } public void AddWarning(string warning) { Warnings.Add(warning); } } public class SzfField { public string Name { get; set; } = string.Empty; public string Type { get; set; } = string.Empty; public object? Value { get; set; } }