using System.Text.Json.Serialization;
namespace Deal.Modules.Pipeline.Application.Models;
///
/// Элемент очереди входящих — item ответа GET /api/pipeline/queue (§4.5 L308, processing.list_queue L218–241).
///
///
/// Поля 1:1 с §4.5 (фронт читает: id/text/status/ch/msgAt; dialogId/msgId/queuedAt — справочные). Status —
/// new (ждёт правил/дедупа/ML) | filtered (прошла «new»-проход, ждёт ИИ; в счётчиках — bucket
/// «ai»). Времена наружу epoch-ms; маппинг с DateTimeOffset-строкой (Ruling 1) выполняет адаптер хранилища.
/// — внутренний флаг строки «возвращено из отсева» (Ruling 2/8), в JSON не выходит
/// ([JsonIgnore]): прототипная запись pipeline_msg несёт force, но wire очередь её не отдаёт.
///
public sealed record QueueItemDto
{
///
/// Короткий id строки очереди (префикс p_, Ruling 10).
///
public string Id { get; init; } = string.Empty;
///
/// Id диалога-источника сообщения.
///
public string DialogId { get; init; } = string.Empty;
///
/// Id исходного сообщения в Telegram (дубль-гвард приёма), либо null.
///
public long? MsgId { get; init; }
///
/// Текст сообщения (обрезан при приёме до 6000 символов, Ruling 2).
///
public string Text { get; init; } = string.Empty;
///
/// Статус строки: new | filtered (значения — как pipeline.py ST_NEW/ST_AI).
///
public string Status { get; init; } = string.Empty;
///
/// Канал-источник (выходит под ключом ch).
///
[property: JsonPropertyName("ch")]
public PipelineChannelDto Channel { get; init; } = new(string.Empty, string.Empty, string.Empty);
///
/// Время исходного сообщения, epoch-ms (выходит под ключом msgAt).
///
[property: JsonPropertyName("msgAt")]
public long MsgAtMs { get; init; }
///
/// Время постановки в очередь (= CreatedAt строки), epoch-ms (выходит под ключом queuedAt).
///
[property: JsonPropertyName("queuedAt")]
public long QueuedAtMs { get; init; }
///
/// Внутренний флаг «возвращено пользователем из отсева»: правила/устарело/ML для строки игнорируются (Ruling 2/8).
///
[JsonIgnore]
public bool Force { get; init; }
}