using foodmarket.Domain.Common;

namespace foodmarket.Domain.Sales;

/// <summary>Кеш ответов на батчи продаж от POS-касс для идемпотентности.
///
/// POS присылает <c>POST /api/pos/sales</c> с <c>IdempotencyKey</c> в теле;
/// при сетевой ошибке POS повторяет тот же батч с тем же ключом, и сервер
/// должен вернуть прежний результат БЕЗ повторного создания продаж в БД.
/// Реализуется через эту таблицу: вставка строки `(OrgId, Key)` через
/// unique-index — выигрыш гонки делает запрос обработчиком, проигравшие
/// читают <c>ResponseJson</c>.
///
/// <c>OrganizationId</c> наследуется через <see cref="TenantEntity"/> и
/// query-filter ограничивает выборку — POS чужой орги не может прочитать
/// чужой ack даже с угаданным ключом. Дополнительно ack TTL'ятся фоновым
/// cleanup'ом (Hangfire) — 30 дней.</summary>
public class PosBatchAck : TenantEntity
{
    /// <summary>Idempotency-ключ, присланный POS. Уникален в рамках организации.</summary>
    public Guid IdempotencyKey { get; set; }

    /// <summary>Сериализованный ответ (PosSaleBatchResponse без поля
    /// ReplayedFromCache — это поле выставляется true при репроигрывании).</summary>
    public string ResponseJson { get; set; } = "";
}
