namespace EventSubscriber.Application;
///
/// An inbound NRC (Open Notificaties) notification, as Open Notificaties POSTs it to an
/// abonnement callback. Only the fields the projection needs are modelled; the full ZGW
/// "Notificatie" resource also carries aanmaakdatum and kenmerken which the
/// minimal projection ignores (bsn is deferred — see ADR-0008). For a zaken/zaak/create
/// notification hoofdObject and resourceUrl are both the created zaak's URL.
///
public sealed record Notification(
string Kanaal,
string Resource,
string Actie,
Uri ResourceUrl)
{
/// The only event the walking-skeleton projection reacts to: a zaak being created.
public bool IsZaakCreated =>
Kanaal == "zaken" && Resource == "zaak" && Actie == "create";
/// The zaak UUID — the trailing path segment of the resource URL — used as the projection key.
public string ZaakId => ResourceUrl.Segments[^1].Trim('/');
///
/// A deterministic dedup key. Open Notificaties carries no notification id and may
/// redeliver, so the key is derived from the immutable notification content: two
/// deliveries of the same zaak-create collapse to one. (NRC may also deliver
/// out of order; the projector tolerates that — order does not change the outcome.)
///
public string IdempotencyKey => $"{Kanaal}:{Resource}:{Actie}:{ResourceUrl}";
}