using System.Text.RegularExpressions;
namespace Remiss.Core.Pdf;
/// <summary>
/// Kontrakt (v1) för det maskinläsbara försättsbladet. Vi äger formatet.
///
/// Sida 1 i den sammanfogade PDF:en innehåller:
/// • ordet <see cref="DocumentMarker"/> stort – ankare för "det här är en remiss"
/// • en egen rad enligt <see cref="FormatHsaIdLine"/>: nyckelordet
/// <see cref="HsaIdLabel"/> följt av HSA-id:t, i monospace, överst till vänster
///
/// Nedströms server-OCR läser sida 1 och kör <see cref="TryParseHsaId"/> på texten.
/// Parsern är avsiktligt tolerant mot vanliga OCR-fel (tappat bindestreck/kolon,
/// blandade versaler/gemener, extra blanksteg).
/// </summary>
public static class OcrContract
{
public const string DocumentMarker = "REMISS";
public const string HsaIdLabel = "HSA-ID:";
/// <summary>Exakt den rad som ska renderas maskinläsbart på försättsbladet.</summary>
public static string FormatHsaIdLine(string hsaId) => $"{HsaIdLabel} {hsaId.Trim()}";
// Etiketten följt av id:t på samma rad. Tål tappat bindestreck/kolon och
// enstaka blanksteg som OCR lagt in i id:t – men inte radbrytningar, så
// matchningen inte rinner vidare in i människoläsbar text under.
private static readonly Regex HsaIdPattern = new(
@"HSA[-\s]?ID[:\s]*([A-Za-z0-9][A-Za-z0-9 \-]{2,}[A-Za-z0-9])",
RegexOptions.IgnoreCase | RegexOptions.CultureInvariant | RegexOptions.Compiled);
/// <summary>
/// Plockar ut HSA-id ur (ev. brusig) OCR-text från sida 1.
/// Blanksteg som OCR:n råkat lägga in mitt i id:t tas bort.
/// </summary>
public static bool TryParseHsaId(string ocrText, out string hsaId)
{
hsaId = "";
if (string.IsNullOrWhiteSpace(ocrText))
return false;
var match = HsaIdPattern.Match(ocrText);
if (!match.Success)
return false;
hsaId = Regex.Replace(match.Groups[1].Value, @"\s+", "");
return hsaId.Length > 0;
}
}