namespace Indotalent.ConfigBackEnd.Extensions;

using System.Text.RegularExpressions;

public static class StringExtensions
{
    public static string ToShortNameVowel(this string? value, int length = 3)
    {
        if (string.IsNullOrWhiteSpace(value)) return "GEN";

        var vowels = new string(value.Where(c => "AEIOUaeiou".Contains(c)).ToArray());
        var baseName = vowels.Length >= length ? vowels : value;

        return new string(baseName.Trim().Take(length).ToArray()).ToUpper();
    }

    public static string ToShortNameConsonant(this string? value, int length = 3)
    {
        if (string.IsNullOrWhiteSpace(value)) return "GEN";

        var consonants = new string(value.Where(c => char.IsLetter(c) && !"AEIOUaeiou".Contains(c)).ToArray());
        var baseName = consonants.Length >= length ? consonants : value;

        return new string(baseName.Trim().Take(length).ToArray()).ToUpper();
    }

    public static string ToInitial(this string? value)
    {
        if (string.IsNullOrWhiteSpace(value)) return "XX";

        var words = value.Trim().Split(' ', StringSplitOptions.RemoveEmptyEntries);

        if (words.Length >= 2)
        {
            var firstInitial = words[0][0];
            var secondInitial = words[1][0];
            return $"{firstInitial}{secondInitial}".ToUpper();
        }

        return new string(value.Trim().Take(2).ToArray()).ToUpper();
    }

    public static bool IsNotNullOrWhiteSpace(this string? value)
    {
        return !string.IsNullOrWhiteSpace(value);
    }

    public static string ToTitleCase(this string? value)
    {
        if (string.IsNullOrWhiteSpace(value)) return string.Empty;

        return System.Globalization.CultureInfo.CurrentCulture.TextInfo
            .ToTitleCase(value.ToLower().Trim());
    }

    public static string ToSlug(this string? value)
    {
        if (string.IsNullOrWhiteSpace(value)) return string.Empty;

        var str = value.ToLower().Trim();
        str = Regex.Replace(str, @"[^a-z0-9\s-]", "");
        str = Regex.Replace(str, @"[\s-]+", " ").Trim();
        str = str.Replace(" ", "-");

        return str;
    }

    public static string MaskEmail(this string? email)
    {
        if (string.IsNullOrWhiteSpace(email) || !email.Contains("@")) return "******";

        var parts = email.Split('@');
        var name = parts[0];
        var domain = parts[1];

        if (name.Length <= 2) return $"{name}***@{domain}";

        return $"{name[..2]}***{name[^1..]}@{domain}";
    }

    public static string Truncate(this string? value, int maxLength)
    {
        if (string.IsNullOrWhiteSpace(value)) return string.Empty;
        return value.Length <= maxLength ? value : $"{value[..maxLength]}...";
    }

    public static string RemoveNonNumeric(this string? value)
    {
        if (string.IsNullOrWhiteSpace(value)) return string.Empty;
        return Regex.Replace(value, "[^0-9]", "");
    }
}