using OnlyOneAccessTemplate.Models; namespace OnlyOneAccessTemplate.Services { public interface ISiteConfigurationService { Task GetConfigurationAsync(string language); SiteConfiguration GetConfiguration(string language); // Versão síncrona para o BaseController Task GetPageContentAsync(string language, string pageName); Task GenerateSitemapAsync(); Task GenerateRobotsAsync(); Task UpdateConfigurationAsync(SiteConfiguration config); Task> GetAvailableLanguagesAsync(); Task ConfigurationExistsAsync(string language); Task DeleteConfigurationAsync(string language); } public interface ILanguageService { string GetCurrentLanguage(HttpContext context); string GetLanguageFromPath(string path); List GetSupportedLanguages(); string GetDefaultLanguage(); string GetLanguageDisplayName(string languageCode); Dictionary GetHreflangUrls(string currentUrl, string currentLanguage); string GetCultureInfo(string languageCode); void SetLanguageCookie(HttpContext context, string languageCode); string GenerateLanguageSwitcher(HttpContext context, string currentLanguage); bool IsRtlLanguage(string languageCode); string GetLanguageDirection(string languageCode); bool IsValidLanguage(string languageCode); string NormalizeLanguageCode(string languageCode); } public interface IConversionService { Task ProcessConversionAsync(ConversionData data); Task GetConversionStatsAsync(string language, DateTime from, DateTime to); Task LogConversionEventAsync(string eventName, Dictionary properties); Task GetConversionByIdAsync(string conversionId); Task> GetConversionsAsync(string language, int skip = 0, int take = 50); Task ValidateFormDataAsync(Dictionary formData, List formFields); Task GetRealTimeStatsAsync(string language); Task> GetConversionMetricsAsync(string language, string period); Task SendConversionNotificationAsync(ConversionRecord conversion); Task> GetConversionTrendsAsync(string language, DateTime from, DateTime to, string groupBy = "day"); } public interface ISeoService { Task GenerateSeoMetadataAsync(string language, string pageName, PageContent? content = null); Task GenerateStructuredDataAsync(string language, string pageType, object data); Task> ValidateSeoAsync(string url); Task GenerateMetadataForPageAsync(HttpContext context, string language, string pageName, PageContent? customContent = null); Task GenerateCanonicalUrlAsync(HttpContext context, string language, string pageName); Task> GenerateMetaTagsAsync(SeoMetadata metadata); Task GenerateOpenGraphTagsAsync(SeoMetadata metadata); Task GenerateTwitterCardTagsAsync(SeoMetadata metadata); Task GenerateJsonLdAsync(string language, string pageType, object data); bool ValidateMetadata(SeoMetadata metadata, out List issues); } // Interfaces adicionais public interface ICacheService { Task GetAsync(string key) where T : class; Task SetAsync(string key, T value, TimeSpan? expiration = null) where T : class; Task RemoveAsync(string key); Task RemoveByPatternAsync(string pattern); Task ExistsAsync(string key); } public interface IAnalyticsService { Task TrackPageViewAsync(string language, string pageName, string userAgent, string ipAddress, string? referrer = null); Task TrackEventAsync(string eventName, string language, Dictionary properties); Task GetAnalyticsAsync(string language, DateTime from, DateTime to); Task> GetPopularPagesAsync(string language, int limit = 10); Task> GetTrafficSourcesAsync(string language, DateTime from, DateTime to); } public interface IEmailService { Task SendConversionNotificationAsync(ConversionRecord conversion, string toEmail); Task SendWelcomeEmailAsync(string toEmail, string name, string language); Task SendBulkEmailAsync(List emails, string subject, string content, string language); Task GetEmailTemplateAsync(string templateName, string language); } public interface IValidationService { ValidationResult ValidateFormData(Dictionary formData, List formFields); bool ValidateEmail(string email); bool ValidatePhone(string phone, string? countryCode = null); bool ValidateRequired(string value); bool ValidateRegex(string value, string pattern); ValidationResult ValidateConversionData(ConversionData data); } public interface IFileService { Task UploadImageAsync(IFormFile file, string folder = "uploads"); Task DeleteFileAsync(string filePath); Task ResizeImageAsync(string filePath, int width, int height); Task> GetImagesAsync(string folder = "uploads"); bool IsValidImageFile(IFormFile file); } // DTOs e Records public record ConversionData( string Language, string PageName, Dictionary FormData, string UserAgent, string IpAddress, string? Referrer = null, string? SessionId = null, Dictionary? UtmParameters = null ); public record ConversionStats( int TotalVisits, int TotalConversions, double ConversionRate, Dictionary ConversionsBySource, Dictionary? ConversionsByMedium = null, Dictionary? ConversionsByPage = null, DateTime? LastUpdated = null ); public record ConversionTrend( DateTime Date, int Conversions, int Visits, double ConversionRate ); public record SeoMetadata( string Title, string Description, string Keywords, string OgTitle, string OgDescription, string OgImage, string CanonicalUrl, Dictionary HreflangUrls, string StructuredData, string? OgType = "website", string? TwitterCard = "summary_large_image", string? Author = null, DateTime? LastModified = null ); public record SeoIssue( string Type, string Message, string Severity, string Element, string? Recommendation = null, string? HelpUrl = null ); public record AnalyticsData( int TotalPageViews, int UniqueVisitors, Dictionary PageViews, Dictionary TrafficSources, double AverageSessionDuration, double BounceRate ); public record PopularPage( string PageName, string Title, int Views, double ConversionRate ); public record EmailTemplate( string Name, string Subject, string HtmlContent, string TextContent, string Language ); public record ValidationResult( bool IsValid, List Errors, Dictionary? FieldErrors = null ); // Enums public enum SeoIssueSeverity { Low, Medium, High, Critical } public enum ConversionEventType { PageView, FormStart, FormSubmit, ConversionComplete, DownloadStart, VideoPlay, EmailClick, PhoneClick } public enum CacheType { Memory, Distributed, Database } }