using System.Globalization; using System.Net.Mail; using System.Text; using GeradoresService.Core; using GeradoresService.Data; namespace GeradoresService.Generators.Contactos; public sealed class EmailGenerator : GeneratorBase { public override string Id => "email"; public override string Name => "Email"; public override string Category => Categories.Contactos; public override string Description => "Endereço de email fictício. Por omissão usa domínios reservados para testes (example.com)."; public override bool HasChecksum => false; public override IReadOnlyList Options => [ Option("dominio", "Domínio", "teste", ("teste", "Reservado para testes (example.com)"), ("realista", "Realista (gmail.com, sapo.pt…)")), ]; public override GeneratedItem Generate(GeneratorContext context) { var first = context.Random.Next(2) == 0 ? context.Pick(PtData.MaleNames) : context.Pick(PtData.FemaleNames); return new GeneratedItem(Build(first, context.Pick(PtData.Surnames), context, context.Option(Options[0]) == "realista")); } public static string Build(string firstName, string surname, GeneratorContext context, bool realistic = false) { var domains = realistic ? PtData.RealisticEmailDomains : PtData.SafeEmailDomains; var separator = context.Pick([".", "_", ""]); var suffix = context.Random.Next(3) == 0 ? context.Random.Next(1, 100).ToString() : ""; return $"{Slug(firstName)}{separator}{Slug(surname)}{suffix}@{context.Pick(domains)}"; } private static string Slug(string s) { var sb = new StringBuilder(); foreach (var c in s.Normalize(NormalizationForm.FormD)) if (CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark && char.IsLetterOrDigit(c)) sb.Append(char.ToLowerInvariant(c)); return sb.ToString(); } public override ValidationResult Validate(string value) { var v = value.Trim(); var at = v.LastIndexOf('@'); if (at <= 0 || at == v.Length - 1 || !v[(at + 1)..].Contains('.') || v.Any(char.IsWhiteSpace) || !MailAddress.TryCreate(v, out var address) || address.Address != v) return ValidationResult.WrongFormat("Não é um endereço de email válido."); return ValidationResult.Valid(v.ToLowerInvariant(), "Formato de email válido."); } }