using New.Application.Worklist;
namespace New.Api.Contracts;
///
/// Builds the presentation-only `actions`/`seams` blocks on top of a
/// CaseDetail read model. This is deliberately New.Api's job, not the
/// resolver's or either source's - it's about which endpoints exist, which
/// is an API-shape concern, not a data-source concern.
///
internal static class CaseDetailResponseFactory
{
public static CaseDetailResponse From(CaseDetail detail)
{
var actions = detail.Origin == WorklistOrigin.Legacy
? BuildLegacyActions(detail.LegacyAanvraagId!.Value)
: BuildOwnedActions(detail.RegistrationApplicationId!.Value);
var seams = detail.Origin == WorklistOrigin.Legacy
? new Dictionary { ["aanvrager"] = "legacy-backend", ["procestijdlijn"] = null }
: new Dictionary { ["aanvrager"] = "owned", ["procestijdlijn"] = "case-framework-timeline" };
return new CaseDetailResponse(
detail.Origin.ToString(),
detail.LegacyAanvraagId,
detail.RegistrationApplicationId,
detail.Surname,
detail.Initials,
detail.Bsn,
AddressResponse.From(detail.Address),
detail.Email,
detail.Phone,
detail.PreferredChannel,
detail.DiplomaCode,
detail.DiplomaCountryOfIssue,
detail.DiplomaIssuedOn,
detail.ReceivedOn,
AssessmentResponse.From(detail.Assessment),
detail.ProcessStatus,
detail.LastModifiedAt,
actions,
seams);
}
private static CaseDetailActions BuildLegacyActions(int aanvraagId) => new(
EditApplicantDetails: new ActionLink("writeThrough", $"/api/worklist/legacy/{aanvraagId}/details"),
RecordAssessment: new ActionLink("redirect", $"/legacy/aanvraag/{aanvraagId}/beoordeling"),
TakeOwnership: new ActionLink("transition", $"/api/worklist/legacy/{aanvraagId}/take-ownership"));
private static CaseDetailActions BuildOwnedActions(Guid registrationApplicationId) => new(
EditApplicantDetails: new ActionLink("owned", $"/api/worklist/owned/{registrationApplicationId}/details"),
RecordAssessment: new ActionLink("owned", $"/api/worklist/owned/{registrationApplicationId}/assessment"),
ReleaseOwnership: new ActionLink("transition", $"/api/worklist/owned/{registrationApplicationId}/ownership"));
}