using System;
using System.Collections.Generic;
using Ban.Sdaid.Notation.Documents;
using Ban.Sdaid.Icd.Domain.Cards.Template;
using Ban.Sdaid.Icd.Domain.Processing;
namespace Ban.Sdaid.Icd.Domain.Capture
{
/// <summary>Значение поля пакета: что стоит в поле сейчас, что прочла модель и откуда это взято.</summary>
[DomainEntity]
public class PacketFieldValue
{
/// <summary>Идентификатор значения.</summary>
public Guid Id { get; init; }
/// <summary>Атрибут вида документа, значение которого хранится.</summary>
[Relation]
public DocumentKindAttribute KindAttribute { get; init; } = null!;
/// <summary>Поле формы, если атрибут напечатан на бланке; null — поле вводится вручную.</summary>
[Relation]
public FormField? FormField { get; init; }
/// <summary>Текущие значения: результат распознавания либо правка пользователя.</summary>
public IReadOnlyList<string> Values { get; init; } = new string[0];
/// <summary>Значения, которые вернула модель; сохраняются даже после правки.</summary>
public IReadOnlyList<string> RecognizedValues { get; init; } = new string[0];
/// <summary>Происхождение текущего значения: распознано или введено пользователем.</summary>
[Relation]
public ValueOrigin Origin { get; init; }
/// <summary>Уверенность распознавания, 0..1; null — значение не распознавалось.</summary>
public double? Confidence { get; init; }
/// <summary>Кадр, с которого получено значение; null — источника нет.</summary>
[Relation]
public ImageFrame? ImageFrame { get; init; }
/// <summary>Область на кадре; null — значение отнесено к кадру целиком либо источника нет.</summary>
[Relation(Kind = RelationKind.Composition)]
public SourceArea? Area { get; init; }
}
/// <summary>Описание доменной сущности <see cref="PacketFieldValue"/>.</summary>
public class PacketFieldValueSpec : IDomainEntityDocument
{
public static string _refName = "значение поля пакета";
public Type Entity => typeof(PacketFieldValue);
public string Name => "Значение поля пакета";
public string Description =>
@"Значение атрибута в пакете ввода: текущее и распознанное, с уверенностью и указанием кадра и области, откуда оно получено.";
public string Version => "0.1";
public string Status => "draft";
public string[] Comments => new[]
{
"2026-08-19. Заведено по варианту 5 решения о структуре данных; заместило распознанное поле и идентификатор пакета.",
};
public static string S1_Binding = """
## К чему привязано значение
Значение ссылается на **атрибут вида документа** обязательно, а на **поле формы** —
только если атрибут на бланке напечатан. Место хранения поля формы не имеет: его
неоткуда распознать, оно всегда вводится вручную. Ссылка на поле нужна для показа —
подпись, порядок, подсветка фрагмента.
Отсюда следует, что отдельной сущности «идентификатор пакета» не нужно: шифр,
инвентарный номер, место хранения и дата — обычные атрибуты вида документа, и их
значения хранятся наравне с остальными.
Заполнил пользователь значение при формировании пакета или при проверке — разницы нет,
это одно и то же значение одного и того же атрибута; различается только происхождение.
""";
public static string S2_TwoSets = """
## Два набора значений
У значения два набора: текущий и то, что вернула модель. Исправление пользователя
не затирает распознанное.
Причина не в аудите. Пары «что модель прочла / что там на самом деле» и есть материал
для дообучения, который Сервис накапливает попутно, разбирая архив. Если исправление
затирает распознанное, материал теряется навсегда — и восстановить его неоткуда.
""";
public static string S3_Source = """
## Источник значения
Источник — **свойства самого значения**: кадр и область, оба необязательные.
| Как получено | Кадр | Область |
|---|---|---|
| Распознано из клетки бланка | есть | есть |
| Отнесено к странице целиком | есть | нет |
| Введено пользователем вручную | нет | нет |
Отдельная сущность источника понадобилась бы, если бы одно значение собиралось
из нескольких мест; на бланке такого не бывает.
Кадр указывает на снимок, а страница формы известна через сам кадр — он к ней отнесён.
Поэтому переназначение кадра другой странице делает распознанные значения
недействительными: они получены в предположении другой разметки.
""";
public static string S4_Lifecycle = """
## Что происходит со значением дальше
Значение живёт в пакете и в карту как таковое не переходит. При создании карты значения
становятся атрибутами документов карты, а уверенность, распознанный набор, кадр
и область остаются в пакете: карта — документ о результатах обработки, а не о том,
как прошло распознавание.
""";
public static string S99_Related = $"""
## Связанные артефакты
- {nameof(Ban.Sdaid.Icd.Arch.Adr.ADR_005_FieldValueSourceBinding)} — решение о привязке значения к источнику
- {nameof(Ban.Sdaid.Icd.Arch.Adr.ADR_006_CardDataStructure)} — решение о структуре данных информационной карты
""";
}
}