using System.Text; using Core.Entities; using Core.Models; using Core.Parsers; namespace Core.Services; /// /// Service implementation for parsing event occurrence text data. /// Wraps EventOccurrenceParser to support text input and error collection. /// public class EventOccurrenceParserService : IEventOccurrenceParserService { /// public EventOccurrenceParseResult ParseFromText(string text, ICollection events) { var result = new EventOccurrenceParseResult(); if (string.IsNullOrWhiteSpace(text)) { result.Errors.Add("Input text is empty or whitespace."); return result; } try { // Create a temporary file from the text content var tempFile = Path.GetTempFileName(); try { File.WriteAllText(tempFile, text, Encoding.UTF8); var fileInfo = new FileInfo(tempFile); // Use the existing EventOccurrenceParser var parser = new EventOccurrenceParser(fileInfo, events); var parsedOccurrences = parser.Parse(); // Convert parsed occurrences to result format, handling special event types foreach (var kvp in parsedOccurrences) { var eventDefinition = kvp.Key; var occurrences = kvp.Value; // Check if this is a special event type (GeneralSchedule or VotingDelegates) if (eventDefinition == EventDefinition.GeneralSchedule || eventDefinition == EventDefinition.VotingDelegates) { // For special events, set EventDefinitionId to null and set SpecialEventType foreach (var occurrence in occurrences) { occurrence.EventDefinitionId = null; occurrence.SpecialEventType = eventDefinition == EventDefinition.GeneralSchedule ? "GeneralSchedule" : "VotingDelegates"; } // Add to result with the special EventDefinition as key result.Occurrences[eventDefinition] = occurrences; } else { // For regular events, set EventDefinitionId and ensure SpecialEventType is null foreach (var occurrence in occurrences) { occurrence.EventDefinitionId = eventDefinition.Id; occurrence.SpecialEventType = null; } result.Occurrences[eventDefinition] = occurrences; } } // Track any occurrences without a matching EventDefinition // (This would be detected if parser.Parse() returns occurrences with null EventDefinition keys, // but the current parser implementation doesn't do this - all occurrences have a currentEventDefinition) } finally { // Clean up temporary file try { if (File.Exists(tempFile)) { File.Delete(tempFile); } } catch { // Ignore cleanup errors } } } catch (Exception ex) { result.Errors.Add($"Error parsing text: {ex.Message}"); if (ex.InnerException != null) { result.Errors.Add($"Inner exception: {ex.InnerException.Message}"); } } return result; } }