using System.Globalization; using System.Net; using System.Text; using JobTrackerApi.Models; namespace JobTrackerApi.Services; public sealed record CoverLetterRenderDto(string Html, string ThemeId, string SuggestedFileName); public sealed class CoverLetterDocumentRenderer { public CoverLetterRenderDto Render(string? text, CoverLetterDocumentSettings? settings) { var s = CoverLetterDocumentSettingsJson.Normalize(settings); static string E(string? value) => WebUtility.HtmlEncode(value ?? ""); static string F(double? value) => value!.Value.ToString("0.##", CultureInfo.InvariantCulture); var font = s.BodyFont!; var size = s.PageSize == "letter" ? "215.9mm 279.4mm" : "210mm 297mm"; var width = s.PageSize == "letter" ? "215.9mm" : "210mm"; var height = s.PageSize == "letter" ? "279.4mm" : "297mm"; var body = new StringBuilder(); var list = false; foreach (var line in (text ?? "").Replace("\r\n", "\n").Replace('\r', '\n').Split('\n')) { var bullet = line.StartsWith("- ", StringComparison.Ordinal) || line.StartsWith("* ", StringComparison.Ordinal); if (bullet && !list) { body.Append(""); list = false; } if (bullet) body.Append("
  • ").Append(ThemedCvRenderer.Inline(line[2..])).Append("
  • "); else if (line.Length > 0) body.Append("

    ").Append(ThemedCvRenderer.Inline(line)).Append("

    "); else body.Append("
    "); } if (list) body.Append(""); var contact = string.Join(" · ", new[] { s.SenderEmail, s.SenderPhone, s.SenderLocation }.Where(v => !string.IsNullOrWhiteSpace(v)).Select(E)); var letterLabel = s.Language == "nb-NO" ? "Søknadsbrev" : "Cover letter"; var bodyLabel = s.Language == "nb-NO" ? "Brevtekst" : "Cover letter text"; var title = string.Join(" — ", new[] { s.Subject, s.SenderName }.Where(value => !string.IsNullOrWhiteSpace(value))); var senderHeading = string.IsNullOrWhiteSpace(s.SenderName) ? "" : $"

    {E(s.SenderName)}

    "; var subjectHeading = string.IsNullOrWhiteSpace(s.Subject) ? "" : $"

    {E(s.Subject)}

    "; var html = $$""" {{E(string.IsNullOrEmpty(title) ? letterLabel : title)}}
    {{senderHeading}}
    {{E(s.SenderTitle)}}
    {{contact}}
    {{E(s.Date)}}
    {{E(s.Recipient)}}
    {{subjectHeading}}
    {{body}}
    """; return new(html, s.ThemeId, "cover-letter.pdf"); } }