using System.Text.Json.Serialization;
namespace CoreConnect.Commerce.Messages;
public class UpdateProductMessage
    public string? ProductKey { get; set; }
    public string? SKU { get; set; }
    public string? VariantKey { get; set; }
    public List<UpdateReference>? Categories { get; set; }
    public UpdateReference? TaxCategory { get; set; }
    public bool? Enabled { get; set; }
    public UpdateReference? ProductTypeKey { get; set; }
    public Dictionary<string, string>? Name { get; set; }
    public Dictionary<string, string>? Slug { get; set; }
    public Dictionary<string, string>? Description { get; set; }
    public Dictionary<string, UpdateImage>? Images { get; set; }
    public Dictionary<string, string>? MetaTitle { get; set; }
    public Dictionary<string, string>? MetaDescription { get; set; }
    public List<UpdateAttribute> AttributeMap { get; set; } = new List<UpdateAttribute>();
public class AttributeTypes
    public const string String = "String";
    public const string LocalizedString = "LocalizedString";
    public const string Enum = "Enum";
    public const string LocalizedEnum = "LocalizedEnum";
    public const string Date = "Date";
    public const string Boolean = "Boolean";
    public const string Double = "Double";
    public const string Decimal = "Decimal";
    public const string Money = "Money";
    public const string Array = "Array";
    public const string Record = "Record";
[UnionCase(typeof(UpdateAttribute.StringAttribute), nameof(AttributeTypes.String))]
[UnionCase(typeof(UpdateAttribute.LocalizedStringAttribute), nameof(AttributeTypes.LocalizedString))]
[UnionCase(typeof(UpdateAttribute.EnumAttribute), nameof(AttributeTypes.Enum))]
[UnionCase(typeof(UpdateAttribute.LocalizedEnumAttribute), nameof(AttributeTypes.LocalizedEnum))]
[UnionCase(typeof(UpdateAttribute.DateAttribute), nameof(AttributeTypes.Date))]
[UnionCase(typeof(UpdateAttribute.BooleanAttribute), nameof(AttributeTypes.Boolean))]
[UnionCase(typeof(UpdateAttribute.DoubleAttribute), nameof(AttributeTypes.Double))]
[UnionCase(typeof(UpdateAttribute.DecimalAttribute), nameof(AttributeTypes.Decimal))]
[UnionCase(typeof(UpdateAttribute.MoneyAttribute), nameof(AttributeTypes.Money))]
[UnionCase(typeof(UpdateAttribute.ArrayAttribute), nameof(AttributeTypes.Array))]
[UnionCase(typeof(UpdateAttribute.RecordAttribute), nameof(AttributeTypes.Record))]
[JsonConverter(typeof(UnionConverter<UpdateAttribute>))]
public abstract record UpdateAttribute(string name)
    public abstract string Kind { get; }
    public record StringAttribute(string name, string value) : UpdateAttribute(name) {  public override string Kind { get { return AttributeTypes.String; } } }
    public record LocalizedStringAttribute(string name, Dictionary<string, string> value) : UpdateAttribute(name) { public override string Kind { get { return AttributeTypes.LocalizedString; } } }
    public record EnumAttribute(string name, string value) : UpdateAttribute(name) { public override string Kind { get { return AttributeTypes.Enum; } } }
    public record LocalizedEnumAttribute(string name, string value) : UpdateAttribute(name) { public override string Kind { get { return AttributeTypes.LocalizedEnum; } } }
    public record DateAttribute(string name, DateTime value) : UpdateAttribute(name) { public override string Kind { get { return AttributeTypes.Date; } } }
    public record BooleanAttribute(string name, bool value) : UpdateAttribute(name) { public override string Kind { get { return AttributeTypes.Boolean; } } }
    public record DoubleAttribute(string name, double value) : UpdateAttribute(name) { public override string Kind { get { return AttributeTypes.Double; } } }
    public record DecimalAttribute(string name, decimal value) : UpdateAttribute(name) { public override string Kind { get { return AttributeTypes.Decimal; } } }
    public record MoneyAttribute(string name, string currency, decimal value) : UpdateAttribute(name) { public override string Kind { get { return AttributeTypes.Money; } } }
    public record ArrayAttribute(string name, List<UpdateAttribute> value) : UpdateAttribute(name) { public override string Kind { get { return AttributeTypes.Array; } } }
    public record RecordAttribute(string name, List<UpdateAttribute> value) : UpdateAttribute(name) { public override string Kind { get { return AttributeTypes.Record; } } }
public record UpdateImage(string url, string contentType, long? width = default, long? height = default, string? hint = default);