using System;
using Ban.Sdaid.Notation.Documents;
using Ban.Sdaid.Notation.Glossary;
using Ban.Sdaid.Icd.ChangeRequests;
using Ban.Sdaid.Icd.Glossary.Terms;
namespace Ban.Sdaid.Icd.Arch.Adr
{
/// <summary>
/// Решение: незавершённая работа над картой остаётся в пакете ввода. Информационная карта
/// создаётся только с заполненными обязательными полями и состояния не имеет.
/// </summary>
public class ADR_012_UnfinishedCardLivesInPacket : IAdrDocument, IHasStructuralLinks
{
public static string _refName = "ADR-012 «Незавершённая карта живёт в пакете ввода»";
public string Name => "ADR-012. Незавершённая карта живёт в пакете ввода";
public string Description =>
@"Где хранится работа над картой, которую не удалось закончить: в карте со статусом «черновик» или в пакете ввода.";
public string Version => "0.1";
public string Status => "accepted";
public string[] Comments => new[]
{
"2026-08-26. Заведён по запросу на изменение «Обязательные поля ИК».",
};
public Type? Supersedes => null;
public SdaidLink[] Links => new[]
{
Rel.Uses<DOC_CR_2026_08_25_MandatoryCardFields>(),
};
public static string S1_Context = $"""
## Контекст
Часть обязательных полей может быть не заполнена на самом бумажном бланке. Заказчик
просит не терять работу: сохранить проверенное, дособрать недостающие сведения
и вернуться, чтобы дозаполнить. Выгружать такую карту в АБИС нельзя.
Значения полей уже хранятся в {GlossaryAnchors.RefTo<InputPacket>("пакете ввода")} —
вместе с уверенностью распознавания, кадром-источником и областью на нём; у пакета есть
состояния и очередь, через которую к нему возвращаются. Информационная карта — результат
проверки, состояния не имеет.
""";
public static string S2_Decision = """
## Решение
**Незавершённая работа остаётся в пакете ввода.** Проверка завершается либо созданием
карты, в которой заполнены все обязательные поля, либо ничем: пакет остаётся в состоянии
«Проверка» за оператором вместе с внесёнными значениями.
**Карта состояния не имеет.** Она создаётся только полной, и другой не бывает.
«Черновик» — слово для описания ситуации, а не сущность модели и не элемент интерфейса.
""";
public static string S3_Rationale = """
## Обоснование
Требование звучит как «не терять работу», а не как «завести неполную карту». Работа —
это распознанные и поправленные значения, и они уже лежат в пакете. Дать карте статус
«черновик» значит скопировать их туда же второй раз и держать один факт в двух местах,
нарушив принятое правило: значения принадлежат пакету, потому что уверенность, кадр
и область суть данные о распознавании, а не о результате.
Полнота карты становится **инвариантом** вместо проверки. Запрет «не выгружать неполную
карту» — правило, которое нужно всюду помнить и можно забыть: допустить существование
объекта, а потом везде оговаривать, что с ним нельзя. Когда неполной карты не существует,
запрещать нечего.
Реестр карт остаётся реестром готовых карт, и ни выгрузке, ни поиску, ни отчётности
не приходится различать два сорта записей.
""";
public static string S4_Consequences = """
## Следствия
- Новых сущностей и состояний не появляется; миграций схемы не требуется.
- Возврат к отложенной работе идёт через очередь тем же экраном проверки — второй экран
редактирования карты не нужен.
- Пакет живёт дольше обычного: занимает место в хранилище и остаётся закреплённым
за оператором, пока тот не создаст карту или не вернёт пакет в очередь.
- Жёсткое удаление пакета уничтожает и внесённые значения — это осознанная цена,
такое удаление доступно не всякому.
- Поле, которое нельзя установить в принципе, — повод пересмотреть перечень обязательных
атрибутов вида, а не повод заводить карту-исключение.
""";
public static string S5_Alternatives = """
## Отвергнутые варианты
**Карта со статусом «черновик».** Проверка всегда завершается созданием карты; неполная
получает статус, к ней возвращаются и дозаполняют. Отвергнут: у карты появляется
жизненный цикл, значения хранятся дважды, реестр карт смешивает черновики с готовыми
картами, выгрузка обязана проверять статус, и требуется второй экран редактирования —
с изображениями бланка, то есть та же проверка заново.
""";
}
}