using System.Text;
using System.Text.Json;

namespace YandexMusic.API.Common.Ynison;

/// <summary>Политика именования в формате UPPER_SNAKE_CASE (все буквы верхнего регистра, слова через подчёркивание).</summary>
public class UpperSnakeCaseNamingPolicy : SnakeCaseNamingPolicy
{
    /// <summary>Преобразует имя свойства в формат UPPER_SNAKE_CASE.</summary>
    public override string ConvertName(string name)
    {
        var snakeCase = base.ConvertName(name);
        return snakeCase.ToUpperInvariant();
    }
}

/// <summary>Базовая политика именования в формате snake_case (все буквы нижнего регистра, слова через подчёркивание).</summary>
public class SnakeCaseNamingPolicy : JsonNamingPolicy
{
    /// <summary>Преобразует имя свойства в формат snake_case.</summary>
    public override string ConvertName(string name)
    {
        if (string.IsNullOrEmpty(name))
            return name;

        var sb = new StringBuilder();
        for (int i = 0; i < name.Length; i++)
        {
            char c = name[i];
            if (char.IsUpper(c))
            {
                if (i > 0)
                    sb.Append('_');
                sb.Append(char.ToLowerInvariant(c));
            }
            else
            {
                sb.Append(c);
            }
        }
        return sb.ToString();
    }
}