using System;
using Ban.Sdaid.Notation.Documents;
using Ban.Sdaid.Icd;
using Ban.Sdaid.Icd.Api.Based;
namespace Ban.Sdaid.Icd.Api.Endpoints.InputPackets.NormalizePacket
{
/// <summary>Документ-обёртка над endpoint нормализации кадров пакета (orthocover).</summary>
public class DOC_NormalizePacket : IApiContractDocument, IFolder<ApiFolder>, IHasStructuralLinks
{
public SdaidLink[] Links => new[]
{
Rel.Uses<Ban.Sdaid.Icd.Backend.Handlers.InputPackets.NormalizePacketHandler>(),
};
public static string _refName = "Endpoint NormalizePacket";
public string Name => "Endpoint: NormalizePacket";
public string Description =>
@"Ручной запуск обработки (нормализации orthocover) кадров пакета: перекошенное фото → выровненное «как со сканера». Поведение — NormalizePacketHandler.";
public string Version => "0.1";
public string Status => "draft";
public string[] Comments => new string[0];
public static string Transport = """
## Транспорт
- `POST /api/InputPacket/{id}/frames/{order}/normalize` — обработать **один** кадр (ручной запуск
«повторить обработку» на этапе предобработки).
- `POST /api/InputPacket/{id}/normalize` — обработать **все** кадры пакета.
Параметры — в пути, тела запроса нет. Ответ — единая обёртка со сводкой по кадрам. Обработка
синхронная (≈2–5 с/кадр); фоновой очереди пока нет.
""";
public static string Body = $"""
## Command
{SdaidCode.OfClass<NormalizePacketCommand>()}
## Result
{SdaidCode.OfClass<NormalizePacketResult>()}
## Payload
{SdaidCode.OfClass<NormalizedPacketPayload>()}
## FrameInfo
{SdaidCode.OfClass<NormalizedFrameInfo>()}
""";
}
/// <summary>Команда обработки: `FrameOrder` задан — один кадр; null — все кадры пакета.</summary>
public class NormalizePacketCommand : BasedCommand
{
public Guid PacketId { get; init; }
/// <summary>Порядковый номер кадра; null — обработать все кадры.</summary>
public int? FrameOrder { get; init; }
}
/// <summary>Результат обработки (обёртка + сводка по кадрам).</summary>
public class NormalizePacketResult : BasedResult
{
public NormalizedPacketPayload? Payload { get; init; }
}
/// <summary>Итог: сколько кадров обработано/с ошибкой и результат по каждому.</summary>
public class NormalizedPacketPayload
{
public Guid PacketId { get; init; }
public int Processed { get; init; }
public int Failed { get; init; }
public NormalizedFrameInfo[] Frames { get; init; } = new NormalizedFrameInfo[0];
}
/// <summary>Результат обработки одного кадра.</summary>
public class NormalizedFrameInfo
{
public int Order { get; init; }
public string Role { get; init; } = "";
/// <summary>Получена обработанная картинка (у barcode-типа — нет).</summary>
public bool HasImage { get; init; }
/// <summary>Флаг качества/режима (напр. low_quality); null — нет.</summary>
public string? Flag { get; init; }
/// <summary>Текст ошибки по кадру (сервис недоступен и т.п.); null — успех.</summary>
public string? Error { get; init; }
}
}