using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.IO; using System.Text.Json; using System.Text.Json.Serialization; namespace Adaptation.FileHandlers.pcl; #nullable enable internal class Complete { public Complete(Header header, Summary summary, ReadOnlyCollection points) { Header = header; Summary = summary; Points = points; } public Header Header { get; } public Summary Summary { get; } public ReadOnlyCollection Points { get; } private static ReadOnlyCollection FilterLines(ReadOnlyCollection collection) { List results = new(); foreach (string line in collection) { if (string.IsNullOrEmpty(line) || line is "*" or "@") continue; if (line.Length < 3 || line[0] is not '*' and not '@' || line[1] != ' ') results.Add(line); else results.Add(line.Substring(2)); } return new(results); } public static Complete? Get(Shared.Logistics logistics, List fileInfoCollection, ReadOnlyCollection collection) { Complete? result; Constant constant = new(); ReadOnlyCollection lines = FilterLines(collection); if (collection.Count <= constant.Take) result = null; else { Header? header = Header.Get(constant, lines); if (header is null) result = null; else { Summary? summary = SummarySegment.Get(constant, lines); if (summary is null) result = null; else { ReadOnlyCollection points = Point.GetCollection(constant, lines) ?? throw new NullReferenceException(nameof(summary)); if (points.Count == 0) result = null; else { result = new(header, summary, points); FileInfo fileInfo = new($"{logistics.ReportFullPath}.json"); string json = JsonSerializer.Serialize(result, CompleteSourceGenerationContext.Default.Complete); File.WriteAllText(fileInfo.FullName, json); File.SetLastWriteTime(fileInfo.FullName, logistics.DateTimeFromSequence); fileInfoCollection.Add(fileInfo); } } } } return result; } } [JsonSourceGenerationOptions(WriteIndented = true)] [JsonSerializable(typeof(Complete))] internal partial class CompleteSourceGenerationContext : JsonSerializerContext { }