using System.Text.RegularExpressions; using FitConnect.Interfaces.Sender; using FitConnect.Models; using Microsoft.Extensions.Logging; namespace FitConnect; public class SubmissionBuilder : IEmptySubmission, ISubmissionWithDestination, ISubmissionWithServiceType, ISubmissionWithAttachments, ISubmissionWithData { public class SubmissionToSend { public string? DestinationId { get; internal set; } public string? ServiceName { get; internal set; } public string? LeikaKey { get; internal set; } public Attachment[]? Attachments { get; internal set; } public string? Data { get; internal set; } } private SubmissionToSend _submissionToSend; private ILogger? _logger; public static IEmptySubmission Create(ILogger? logger = null) { return new SubmissionBuilder(logger); } private SubmissionBuilder(ILogger? logger) { _submissionToSend = new SubmissionToSend(); _logger = logger; } public ISubmissionWithDestination WithDestination(string destinationId) { if (!Regex.IsMatch(destinationId, "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$")) throw new ArgumentException("The destination must be a valid GUID"); _submissionToSend.DestinationId = destinationId; return this; } public ISubmissionWithServiceType WithServiceType(string serviceName, string leikaKey) { if (string.IsNullOrWhiteSpace(leikaKey) || !Regex.IsMatch(leikaKey, "^urn:[a-z0-9][a-z0-9-]{0,31}:[a-z0-9()+,.:=@;$_!*'%/?#-]+$")) { _logger?.LogError("The leikaKey must be a valid URN"); throw new ArgumentException("Invalid leika key"); } _submissionToSend.ServiceName = serviceName; _submissionToSend.LeikaKey = leikaKey; return this; } public ISubmissionWithAttachments WithAttachments(params Attachment[] attachments) { _submissionToSend.Attachments = attachments; return this; } public ISubmissionWithData WithData(string data) { _submissionToSend.Data = data; return this; } public SubmissionToSend Build() => _submissionToSend; } public interface IEmptySubmission { ISubmissionWithDestination WithDestination(string destinationId); } public interface ISubmissionWithDestination { ISubmissionWithServiceType WithServiceType(string serviceName, string leikaKey); } public interface ISubmissionWithServiceType { ISubmissionWithAttachments WithAttachments(params Attachment[] attachments); } public interface ISubmissionWithAttachments { ISubmissionWithData WithData(string data); } public interface ISubmissionWithData { SubmissionBuilder.SubmissionToSend Build(); }