using System.Reflection;
using Pf2e.Common;
namespace Pf2e.Web.Helpers;
///
/// Сериализатор сущности для отображения на веб-странице.
///
public class EntitySerializer
{
///
/// Результат сериализации сущности.
///
public class SerializationResult
{
public List Groups { get; set; } = [];
}
///
/// Информация о поле.
///
public class FieldInfo
{
public string Name { get; set; } = string.Empty;
public string Type { get; set; } = string.Empty;
public object? Value { get; set; }
public string DisplayValue { get; set; } = string.Empty;
public bool IsImplemented { get; set; } = true;
}
///
/// Форматтер полей сущности.
///
public EntityFieldFormatter FieldFormatter { get; } = new();
///
/// Сериализовать FullEntity.
///
public SerializationResult Serialize(FullEntity fullEntity)
{
SerializationResult result = new();
//// Группа для основных полей Entity
//FieldGroup entityGroup = new() { Name = "Основные поля" };
//AddFieldsToGroup(entityGroup, fullEntity.Entity);
//result.Groups.Add(entityGroup);
//// Группа для полей IEntity (SubEntity)
//if (fullEntity.SubEntity != null)
//{
// FieldGroup subEntityGroup = new()
// {
// Name = "Поля " + fullEntity.SubEntity.GetType().Name,
// };
// AddFieldsToGroup(subEntityGroup, fullEntity.SubEntity);
// result.Groups.Add(subEntityGroup);
//}
return result;
}
///
/// Добавить поля объекта в группу.
///
//private void AddFieldsToGroup(FieldGroup group, object obj)
//{
// Type type = obj.GetType();
// PropertyInfo[] properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);
// foreach (PropertyInfo property in properties)
// {
// // Пропускаем навигационные свойства Entity
// if (property.Name == "Entity")
// continue;
// object? value = property.GetValue(obj);
// FieldBuilderDefinition fieldInfo = CreateFieldInfo(property, value);
// group.Fields.Add(fieldInfo);
// }
//}
///
/// Создать FieldBuilderDefinition для свойства.
///
/// Поле класса.
/// Значение поля.
/// Информация о поле.
private FieldInfo CreateFieldInfo(PropertyInfo property, object? value)
{
string? displayValue = FieldFormatter.FormatValue(value);
return new()
{
Name = property.Name,
Type = property.PropertyType.Name,
Value = value,
DisplayValue = displayValue ?? "null",
IsImplemented = displayValue is not null,
};
}
}