using System;
using Ban.Sdaid.Notation.Documents;
using Ban.Sdaid.Icd;
using Ban.Sdaid.Icd.Api.Based;
using Ban.Sdaid.Icd.Domain.Capture;
namespace Ban.Sdaid.Icd.Api.Endpoints.InputPackets.GetInputQueue
{
/// <summary>Документ-обёртка над endpoint выдачи очереди пакетов обработки.</summary>
public class DOC_GetInputQueue : IApiContractDocument, IFolder<ApiFolder>, IHasStructuralLinks
{
public SdaidLink[] Links => new[]
{
Rel.Uses<Ban.Sdaid.Icd.Backend.Handlers.InputPackets.GetInputQueueHandler>(),
};
public static string _refName = "Endpoint GetInputQueue";
public string Name => "Endpoint: GetInputQueue";
public string Description =>
@"Список пакетов очереди обработки с составом (кадры и идентификаторы) для страницы «Обработка очереди». Мягко удалённые пакеты исключены. Поведение — GetInputQueueHandler.";
public string Version => "0.1";
public string Status => "draft";
public string[] Comments => new string[0];
public static string Transport = """
## Транспорт
`GET /api/InputPacket` — параметров нет; ответ в единой обёртке (`Payload` ниже). Пагинации пока нет
(упрощённый просмотр): список отсортирован от новых к старым, мягко удалённые исключены.
""";
public static string Body = $"""
## Endpoint
{SdaidCode.OfClass<GetInputQueueEndpoint>()}
## Query
{SdaidCode.OfClass<GetInputQueueQuery>()}
## Result
{SdaidCode.OfClass<GetInputQueueResult>()}
## Payload
{SdaidCode.OfClass<InputQueuePayload>()}
## PacketItem / FrameItem / IdentifierItem
{SdaidCode.OfClass<QueuePacketItem>()}
{SdaidCode.OfClass<QueueFrameItem>()}
{SdaidCode.OfClass<QueueIdentifierItem>()}
""";
}
/// <summary>Endpoint выдачи очереди пакетов.</summary>
public class GetInputQueueEndpoint
{
public GetInputQueueQuery? Input { get; set; }
public GetInputQueueResult? Output { get; set; }
}
/// <summary>Запрос очереди (без параметров).</summary>
public class GetInputQueueQuery : BasedQuery
{
}
/// <summary>Результат — список пакетов в поле Payload.</summary>
public class GetInputQueueResult : BasedResult
{
public InputQueuePayload? Payload { get; init; }
}
/// <summary>Полезная нагрузка очереди.</summary>
public class InputQueuePayload
{
/// <summary>Пакеты очереди, от новых к старым.</summary>
public QueuePacketItem[] Packets { get; init; } = new QueuePacketItem[0];
}
/// <summary>Пакет очереди: сводка и состав.</summary>
public class QueuePacketItem
{
public Guid Id { get; init; }
/// <summary>Номер вида П-ГГГГММДД-NNN.</summary>
public string Number { get; init; } = "";
public DateTime QueuedAt { get; init; }
public int FramesCount { get; init; }
/// <summary>Состояние жизненного цикла; пока только `Queued` — обработки ещё нет.</summary>
public string State { get; init; } = "Queued";
public QueueFrameItem[] Frames { get; init; } = new QueueFrameItem[0];
public QueueIdentifierItem[] Identifiers { get; init; } = new QueueIdentifierItem[0];
}
/// <summary>Кадр в составе пакета.</summary>
public class QueueFrameItem
{
public int Order { get; init; }
/// <summary>Русская подпись роли изображения; null — роль ещё не определена (на вводе не задаётся).</summary>
public string? RoleName { get; init; }
/// <summary>Способ получения кадра.</summary>
[Relation]
public ImageSource Source { get; init; }
/// <summary>Ключ хранения кадра (ADR-002); по нему отдаётся содержимое (GetFrameContent).</summary>
public string StorageKey { get; init; } = "";
public string? OriginalFileName { get; init; }
/// <summary>Есть обработанная (нормализованная) версия кадра — ADR-SRV-005.</summary>
public bool Normalized { get; init; }
/// <summary>Флаг качества/режима нормализации (напр. low_quality); null — нет.</summary>
public string? NormalizationFlag { get; init; }
}
/// <summary>Идентификатор в составе пакета: подпись и значение.</summary>
public class QueueIdentifierItem
{
public string Name { get; init; } = "";
public string Value { get; init; } = "";
}
}