using JSMR.Infrastructure.Common.Locales; using JSMR.Infrastructure.Common.SupportedLanguages; using JSMR.Infrastructure.Http; using System.Globalization; using System.Text.RegularExpressions; namespace JSMR.Infrastructure.Scanning; public partial class EnglishVoiceWorksScanner(IHtmlLoader loader) : VoiceWorksScanner(loader) { [GeneratedRegex(@"Release date: (.*?)[/](\d{1,2})[/](\d{4})", RegexOptions.IgnoreCase, "en-US")] private static partial Regex SalesDateRegex(); [GeneratedRegex(@"^(Early|Middle|Late)\s(.*?)\s(\d{4})", RegexOptions.IgnoreCase, "en-US")] private static partial Regex EstimatedDateRegex(); protected override ILocale Locale => new EnglishLocale(); protected override ISupportedLanguage[] SupportedLanguages => [ new JapaneseLanguage(), new EnglishLanguage(), new AlingualLanguage() ]; protected override DateOnly? GetEstimatedReleaseDate(string expectedDate) { if (expectedDate.Contains("Release Date: TBC", StringComparison.OrdinalIgnoreCase)) return null; Match match = EstimatedDateRegex().Match(expectedDate); if (match.Success == false) return null; GroupCollection groups = match.Groups; int day = groups[1].Value.ToLowerInvariant() switch { "early" => 1, "middle" => 11, "late" => 21, _ => 1 }; string monthAbbreviation = groups[2].Value.Replace(".", ""); int month = DateTime.ParseExact(monthAbbreviation, "MMM", CultureInfo.InvariantCulture).Month; int year = Convert.ToInt32(groups[3].Value); return new DateOnly(year, month, day); } protected override DateOnly? GetSalesDate(string salesDate) { Match match = SalesDateRegex().Match(salesDate); if (match.Success == false) return null; string monthAbbreviation = match.Groups[1].Value; int day = int.Parse(match.Groups[2].Value); int year = int.Parse(match.Groups[3].Value); int month = DateTime.ParseExact(monthAbbreviation, "MMM", CultureInfo.InvariantCulture).Month; return new(year, month, day); } }