using Data.SeaHavenIndustries; using SeaHaven.DataServices.Helpers; namespace SeaHaven.Services.Implementation { /// /// Builds uplift notification email content. Shared by the synchronous request path /// and the lifecycle sweep so content stays consistent without duplication. /// public static class UpliftNotificationMessage { public static (string Subject, string Body) BuildInitial(Dispatch dispatch, DispatchUpliftRequest req, string vendorName, string frontendBase) { var dispatchNum = System.Net.WebUtility.HtmlEncode(dispatch.DispatchNumber ?? ""); var vendor = System.Net.WebUtility.HtmlEncode(vendorName); var reason = System.Net.WebUtility.HtmlEncode(req.VendorReason ?? "(no reason provided)"); var tierText = req.RequiredTier == 2 ? "Tier 2 (Manager approval required)" : "Tier 1"; var subject = $"[Uplift Request] {dispatch.DispatchNumber} — {vendorName} requests ${req.RequestedNTE:F2} (was ${req.CurrentNTE ?? 0m:F2})"; var body = $@"

Vendor Uplift Request

Dispatch: {dispatchNum}

Vendor: {vendor}

Current NTE${req.CurrentNTE ?? 0m:F2}
Requested NTE${req.RequestedNTE:F2}
Delta${UpliftAmount.Of(req):F2}
Required Approval{tierText}

Vendor Reason

{reason}

{ReviewLink(dispatch, frontendBase)}"; return (subject, body); } public static (string Subject, string Body) BuildEscalation(Dispatch dispatch, DispatchUpliftRequest req, string vendorName, string frontendBase) { var dispatchNum = System.Net.WebUtility.HtmlEncode(dispatch.DispatchNumber ?? ""); var vendor = System.Net.WebUtility.HtmlEncode(vendorName); var tierText = req.RequiredTier == 2 ? "Tier 2 (Manager approval required)" : "Tier 1"; var subject = $"[Escalation] Uplift request awaiting decision — {dispatch.DispatchNumber} ({vendorName})"; var body = $@"

Uplift Request Escalation

An uplift request is still awaiting a decision and has passed the escalation threshold.

Dispatch: {dispatchNum}

Vendor: {vendor}

Current NTE${req.CurrentNTE ?? 0m:F2}
Requested NTE${req.RequestedNTE:F2}
Required Approval{tierText}
{ReviewLink(dispatch, frontendBase)}"; return (subject, body); } private static string ReviewLink(Dispatch dispatch, string frontendBase) { var link = dispatch.WorkOrderId.HasValue ? $"{frontendBase.TrimEnd('/')}/workorders/{dispatch.WorkOrderId.Value}" : frontendBase; return $"
Review in SHOC
"; } } }