using System.Text.RegularExpressions; using FitConnect.Models; using Newtonsoft.Json; namespace FitConnect; public class SubmissionBuilder : ISubmissionWithDestination, ISubmissionWithServiceType, ISubmissionWithAttachments, ISubmissionWithData { private readonly SendableSubmission _submissionToSend; private SubmissionBuilder(string destinationId) { _submissionToSend = new SendableSubmission(destinationId); } public static ISubmissionWithDestination WithDestination(string destinationId) { if (!Regex.IsMatch(destinationId, FitConnectClient.GuidPattern)) throw new ArgumentException("The destination must be a valid GUID"); var result = new SubmissionBuilder(destinationId); return result; } public ISubmissionWithServiceType WithServiceType(string serviceName, string leikaKey) { if (string.IsNullOrWhiteSpace(leikaKey) || !Regex.IsMatch(leikaKey, FitConnectClient.LeikaKeyPattern)) { throw new ArgumentException("Invalid leika key"); } _submissionToSend.ServiceName = serviceName; _submissionToSend.LeikaKey = leikaKey; return this; } public ISubmissionWithAttachments WithAttachments(List<Attachment> attachments) => WithAttachments(attachments.ToArray()); public ISubmissionWithAttachments WithAttachments(params Attachment[] attachments) { _submissionToSend.Attachments = attachments; return this; } public ISubmissionWithData WithData(string data) { try { JsonConvert.DeserializeObject(data); } catch (Exception e) { throw new ArgumentException("The data must be valid JSON string", e); } _submissionToSend.Data = data; return this; } public SendableSubmission Build() => _submissionToSend; } public class SendableSubmission { 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; } internal SendableSubmission(string destinationId) { DestinationId = destinationId; } } public interface ISubmissionWithDestination { ISubmissionWithServiceType WithServiceType(string serviceName, string leikaKey); } public interface ISubmissionWithServiceType { ISubmissionWithAttachments WithAttachments(params Attachment[] attachments); ISubmissionWithAttachments WithAttachments(List<Attachment> attachments); } public interface ISubmissionWithAttachments { ISubmissionWithData WithData(string data); } public interface ISubmissionWithData { SendableSubmission Build(); }