using System.Globalization;
namespace Deal.Modules.Tenants.Application.Models;
///
/// Конструктор деталей события аудита
///
public static class AuditDetails
{
// Строковые представления булевых значений (как в JSON).
private const string TrueLiteral = "true";
private const string FalseLiteral = "false";
///
/// Задаёт параметр события
///
/// Код параметра.
/// Значение параметра.
/// Изменение «параметр задан».
public static AuditChangeDto Set(string field, object? value) =>
new(field, null, Format(value));
///
/// Задаёт изменение параметра «было → стало»
///
/// Код параметра.
/// Значение до изменения.
/// Значение после изменения.
/// Изменение «было → стало».
public static AuditChangeDto Change(string field, object? from, object? to) =>
new(field, Format(from), Format(to));
// Приводит значение к строке отображения (инвариантная культура).
// value: Значение параметра.
// Возвращает: Строковое представление либо null.
private static string? Format(object? value) => value switch
{
null => null,
string text => text,
bool flag => flag ? TrueLiteral : FalseLiteral,
DateTimeOffset moment => moment.ToString("O", CultureInfo.InvariantCulture),
IFormattable formattable => formattable.ToString(null, CultureInfo.InvariantCulture),
_ => value.ToString(),
};
}