using System;
using Ban.Sdaid.Notation.Documents;
using Ban.Sdaid.Icd;
using Ban.Sdaid.Icd.Api.Endpoints.InputPackets.SubmitInputPacket;
using Ban.Sdaid.Icd.Domain.Capture;
using Ban.Sdaid.Icd.Arch.Adr;
namespace Ban.Sdaid.Icd.Backend.Handlers.InputPackets
{
/// <summary>Handler постановки пакета ввода в очередь.</summary>
public class SubmitInputPacketHandler : IHandlerDocument, IFolder<BackendFolder>, IHasStructuralLinks
{
public SdaidLink[] Links => new[]
{
Rel.Uses<Ban.Sdaid.Icd.Domain.BC_Icd>(),
Rel.Uses<InputPacketSpec>(),
Rel.Uses<DOC_SubmitInputPacket>(),
Rel.Uses<ADR_002_PacketIdentityAndFileKeys>(),
};
public static string _refName = "Handler SubmitInputPacket";
public string Name => "Handler: SubmitInputPacket";
public string Description =>
@"Что произойдёт при вызове endpoint SubmitInputPacket: собранный пакет получает идентичность (номер и ключи хранения кадров) и становится в очередь обработки.";
public string Version => "0.1";
public string Status => "draft";
public string[] Comments => new string[0];
public static string Purpose = $"""
## Назначение
Канонический сценарий обработки {SdaidAnchors.RefTo<DOC_SubmitInputPacket>()}
(`{nameof(SubmitInputPacketCommand)}`). Создаёт {SdaidAnchors.RefTo<InputPacketSpec>()} и ставит его
в очередь обработки. Идентичность (номер, ключи файлов) возникает **в момент постановки** —
см. {SdaidAnchors.RefTo<ADR_002_PacketIdentityAndFileKeys>()}.
""";
public static string Scenario = $"""
## Сценарий вызова
1. **Валидация:** в пакете есть хотя бы один кадр (`{nameof(SubmitInputPacketCommand.Frames)}`).
Пусто — ошибка `Validation`, пакет не создаётся.
2. **Номер:** присвоить пакету номер вида `П-ГГГГММДД-NNN` — сквозная нумерация в пределах дня
({SdaidAnchors.RefTo<ADR_002_PacketIdentityAndFileKeys>()}).
3. **Кадры:** для каждого кадра (по порядку) назначить ключ хранения `<номер>/<NN>.<расширение>`
(по порядковому номеру, без роли — роль определяется при обработке) и сохранить содержимое в
файловом хранилище. Содержимое — из части `files` (по `{nameof(SubmitFrameItem.FileIndex)}`)
либо скачанное по `{nameof(SubmitFrameItem.Url)}` для кадра-ссылки.
4. **Сохранение:** пакет с кадрами записывается в БД; состояние — `Queued` (производное, отдельным
полем не хранится). Роли кадров и идентификаторы на вводе не заполняются — извлекаются при обработке.
5. **Ответ:** `{nameof(SubmitInputPacketResult)}` с `{nameof(SubmittedPacketPayload)}` —
номер, время постановки и число кадров (для списка «сдано за смену»).
""";
public static string Errors = $"""
## Ошибки и альтернативы
| Ситуация | Поведение |
|---|---|
| Ни одного кадра | Отказ с ошибкой `Validation` — пакет не может быть пустым |
| Кадр-ссылка недоступна по `{nameof(SubmitFrameItem.Url)}` | Отказ: содержимое кадра получить не удалось |
""";
}
}