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;
}
}