using AyCode.Core.Serializers.Attributes;
using AyCode.Core.Serializers.Toons;
using LinqToDB.Mapping;
using Mango.Nop.Core.Entities;

namespace FruitBank.Common.Entities;

[AcBinarySerializable(false, true, false, true, false, false)]
[Table(Name = FruitBankConstClient.OrderDraftItemDbTableName)]
[System.ComponentModel.DataAnnotations.Schema.Table(FruitBankConstClient.OrderDraftItemDbTableName)]
[ToonDescription("Single product line of an AI-parsed order draft", Purpose = "One requested product line within an OrderDraft. The AI resolves the raw product text to an ordered list of candidate NopCommerce products; the admin selects one before approval.")]
public sealed class OrderDraftItem : MgEntityBase
{
    [ToonDescription(Purpose = "FK to the parent OrderDraft.")]
    public int DraftId { get; set; }

    [ToonDescription(Purpose = "The raw product text extracted from the message, as the sender wrote it (e.g. 'piros kalif', '20 rekesz citrom').")]
    public string RawProductText { get; set; } = string.Empty;

    [ToonDescription(Purpose = "The canonical product name as resolved by AI from RawProductText (e.g. 'Kaliforniai paprika piros'). For display purposes.")]
    public string AiResolvedProductName { get; set; } = string.Empty;

    [ToonDescription(Purpose = "Ordered JSON array of candidate NopCommerce Product IDs, best match first. Populated by AI + historical ProductTextMapping weighting.")]
    public string SuggestedProductIdsJson { get; set; } = "[]";

    [ToonDescription(Purpose = "The Product ID selected by the admin during review. Null until admin resolves this item.")]
    public int? SelectedProductId { get; set; }

    [ToonDescription(Purpose = "Quantity as parsed from the message text.", Constraints = "positive")]
    public int RequestedQuantity { get; set; }

    [ToonDescription(Purpose = "Whether this item should become a preorder item (true) or a direct order item (false). Computed from ParsedDeliveryDate of the parent draft: >4 days ahead = true.",
        BusinessRule = "Set at creation time from parent draft's ParsedDeliveryDate. Not editable by admin.")]
    public bool IsPreorder { get; set; }

    [ToonDescription(Purpose = "Display order within the draft, matching the original message sequence.")]
    public int SortOrder { get; set; }
}