using System.Text.Json.Serialization;
namespace Tnsu.ApprovalRoute.Application.Reminders;
/// Вид напоминания — один на конкретный (sealed) наследник, см. их конструкторы.
/// Ссылка на заявку.
/// Id типа заявки (RequestType).
/// Название типа заявки — для читаемости в письме/таблице, без похода в БД.
/// Id заявки (TicketId строки списка согласования / Id строки списка данных).
/// Статус заявки/шага — из того списка, который читает конкретный вид напоминания.
///
/// Уникальный код заявки (колонка RequestUniqueCode списка данных) — null, если у
/// заявки его нет или строка данных не найдена.
///
///
/// Общая часть двух видов напоминаний — и
/// . У них разные поля-триггеры и разные
/// адресаты, общее — только то, что описано здесь (к какой заявке относится строка
/// и как её открыть).
///
/// [JsonPolymorphic]/[JsonDerivedType] — вместо того чтобы полагаться на
/// compile-time тип элемента (ReminderService всегда работает со списком именно
/// этого базового типа, см. IReadOnlyList<ReminderDto>), System.Text.Json без
/// этих атрибутов сериализовал бы только поля базового класса, теряя специфичные
/// для наследника (Email/HoursOverdue или ManagerEmail/CandidateEmail и т.д.).
/// Дискриминатор — отдельное системное поле "$type", а не Category: значение
/// Category читаемое (совпадает с именем enum-константы через уже подключенный
/// глобально JsonStringEnumConverter, см. Program.cs) и не привязано к деталям
/// сериализации.
///
[JsonPolymorphic]
[JsonDerivedType(typeof(ApprovalOverdueReminderDto), nameof(ReminderCategory.ApprovalOverdue))]
[JsonDerivedType(typeof(ProbationEndingReminderDto), nameof(ReminderCategory.ProbationEnding))]
public abstract record ReminderDto(
ReminderCategory Category,
string Url,
int RequestTypeId,
string RequestTypeName,
int RequestId,
string Status,
string? RequestUniqueCode);