using System; using System.Collections.ObjectModel; namespace Adaptation.FileHandlers.pdsf; #nullable enable public class Header { public Header(string title, string recipe, string dateTime, string @operator, string batch, string cassette, bool usedLast, string wafer) { Title = title; Recipe = recipe; DateTime = dateTime; Operator = @operator; Batch = batch; Cassette = cassette; UsedLast = usedLast; Wafer = wafer; } public string Title { get; } public string Recipe { get; } public string DateTime { get; } public string Operator { get; } public string Batch { get; } public string Cassette { get; } public bool UsedLast { get; } public string Wafer { get; } internal static Header Get() => new(string.Empty, string.Empty, string.Empty, string.Empty, string.Empty, string.Empty, false, string.Empty); internal static Header? Get(Constant constant, Header lastHeader, string text, int[] i) { Header? result; // occasionally there are multiple blocks of details, get the last one as earlier ones may be aborted runs. int index = text.LastIndexOf(constant.BioRad); if (index > -1) text = text.Substring(index); if (string.IsNullOrEmpty(text)) result = null; else { bool usedLast; string recipe; string title = Run.GetBefore(text, i, constant.Recipe); string recipeAndDateTime = Run.GetToEOL(text, i); if (recipeAndDateTime.Length < constant.TwoSpaces.Length) recipe = recipeAndDateTime.Trim(); else if (!recipeAndDateTime.Contains(constant.TwoSpaces)) recipe = recipeAndDateTime.Substring(0, 25).Trim(); else recipe = recipeAndDateTime.Split(new string[] { constant.TwoSpaces }, StringSplitOptions.None)[0].Trim(); string dateTime = recipeAndDateTime.Substring(recipe.Length).Trim(); if (dateTime.EndsWith(constant.Period)) dateTime = dateTime.Remove(dateTime.Length - 1, 1); i[0] = Run.ScanPast(text, i, constant.Operator); string @operator = Run.GetBefore(text, i, constant.Batch); string batch = Run.GetToEOL(text, i); i[0] = Run.ScanPast(text, i, constant.Cassette); if (!text.Contains(constant.Cassette)) title = string.Empty; string cassette = Run.GetBefore(text, i, constant.Wafer); if (string.IsNullOrEmpty(batch)) { i[0] = 0; i[0] = Run.ScanPast(text, i, constant.Wafer); } string wafer = Run.GetToEOL(text, i); _ = Run.GetToEOL(text, i); _ = Run.GetToEOL(text, i); if (string.IsNullOrEmpty(wafer)) throw new Exception(constant.WaferFieldIsMissing); if (!string.IsNullOrEmpty(title)) usedLast = false; else { title = lastHeader.Title; recipe = lastHeader.Recipe; @operator = lastHeader.Operator; batch = lastHeader.Batch; cassette = lastHeader.Cassette; usedLast = true; } result = new(title: title, recipe: recipe, dateTime: dateTime, @operator: @operator, batch: batch, cassette: cassette, usedLast: usedLast, wafer: wafer); } return result; } }