using ManagerService.Data;
using System.Linq;
using System.Text.RegularExpressions;
namespace ManagerService.Helpers
{
public static class SlugHelper
{
///
/// Premiers segments d'URL déjà pris par des routes de visitapp-web : un segment
/// statique l'emporte sur [slug], l'instance serait donc inaccessible.
///
private static readonly string[] ReservedSlugs = { "download", "demo", "api" };
public static bool IsTaken(MyInfoMateDbContext db, string slug) =>
ReservedSlugs.Contains(slug) || db.Instances.Any(i => i.WebSlug == slug);
///
/// Generate a URL-safe slug from a name, appending "-1", "-2", etc. until unique among Instances.WebSlug.
///
public static string GenerateUniqueSlug(MyInfoMateDbContext db, string name)
{
var slug = name.ToLowerInvariant();
slug = Regex.Replace(slug, @"[àáâãäå]", "a");
slug = Regex.Replace(slug, @"[èéêë]", "e");
slug = Regex.Replace(slug, @"[ìíîï]", "i");
slug = Regex.Replace(slug, @"[òóôõö]", "o");
slug = Regex.Replace(slug, @"[ùúûü]", "u");
slug = Regex.Replace(slug, @"[ç]", "c");
slug = Regex.Replace(slug, @"[ñ]", "n");
slug = Regex.Replace(slug, @"[^a-z0-9\s-]", "");
slug = Regex.Replace(slug, @"[\s-]+", "-").Trim('-');
var baseSlug = slug;
var counter = 1;
while (IsTaken(db, slug))
slug = $"{baseSlug}-{counter++}";
return slug;
}
}
}