using System;
using Ban.Sdaid.Notation.Documents;
using Ban.Sdaid.Icd;
using Ban.Sdaid.Icd.Api.Endpoints.InputPackets.NormalizePacket;
using Ban.Sdaid.Icd.Domain.Capture;
using Ban.Sdaid.Icd.Arch.Adr;
using Ban.Sdaid.Icd.Arch.Tech.CSharp;
namespace Ban.Sdaid.Icd.Backend.Handlers.InputPackets
{
/// <summary>Handler нормализации кадров пакета через orthocover.</summary>
public class NormalizePacketHandler : IHandlerDocument, IFolder<BackendFolder>, IHasStructuralLinks
{
public SdaidLink[] Links => new[]
{
Rel.Uses<Ban.Sdaid.Icd.Domain.BC_Icd>(),
Rel.Uses<ImageFrameSpec>(),
Rel.Uses<DOC_NormalizePacket>(),
Rel.Uses<ADR_SRV_005_ImageNormalizationOrthocover>(),
Rel.Uses<ADR_002_PacketIdentityAndFileKeys>(),
};
public static string _refName = "Handler NormalizePacket";
public string Name => "Handler: NormalizePacket";
public string Description =>
@"Что произойдёт при запуске обработки: прогнать кадр(ы) пакета через orthocover, сохранить обработанные изображения и проставить на кадре ключ/флаг/время.";
public string Version => "0.1";
public string Status => "draft";
public string[] Comments => new string[0];
public static string Purpose = $"""
## Назначение
Ручная обработка кадров ({SdaidAnchors.RefTo<ImageFrameSpec>()}) по
{SdaidAnchors.RefTo<DOC_NormalizePacket>()} (`{nameof(NormalizePacketCommand)}`): нормализация через
внешний сервис orthocover — решение {SdaidAnchors.RefTo<ADR_SRV_005_ImageNormalizationOrthocover>()}.
Результат нужен этапу «Проверка файлов» (переключение «оригинал ↔ обработанное»).
""";
public static string Scenario = $"""
## Сценарий вызова
1. Найти пакет по `{nameof(NormalizePacketCommand.PacketId)}` (не удалённый) с кадрами; нет — `404`.
2. Отобрать кадры: если задан `{nameof(NormalizePacketCommand.FrameOrder)}` — один кадр, иначе все.
3. По каждому кадру:
- взять оригинал из хранилища по ключу ({SdaidAnchors.RefTo<ADR_002_PacketIdentityAndFileKeys>()});
- определить тип страницы orthocover по роли (штрихкод → `barcode`, остальное → `text`);
- вызвать сервис; сохранить обработанный PNG под ключом `<номер>/<NN>_<роль>_norm.png`;
- проставить на кадре ключ обработанного, флаг качества и время.
4. Сбой по кадру (сервис недоступен и т.п.) не валит остальные — фиксируется в сводке
(`{nameof(NormalizedFrameInfo.Error)}`).
5. Вернуть `{nameof(NormalizePacketResult)}` со сводкой (`{nameof(NormalizedPacketPayload.Processed)}` /
`{nameof(NormalizedPacketPayload.Failed)}`).
""";
}
}