namespace Kompas.Mcp.Core.Modeling;

/// <summary>
/// Имя операции (эскиза, формообразующей, скругления…) в дереве построения.
/// <para>КОМПАС по умолчанию именует объекты по типу и номеру («Эскиз:4», «Операция выдавливания:7»),
/// поэтому дерево из полутора десятков операций ничего не говорит ни человеку, ни агенту,
/// вернувшемуся к модели позже. Имя задаётся при создании; здесь — только нормализация и проверка,
/// чтобы она покрывалась тестами без COM.</para>
/// </summary>
public static class FeatureName
{
    /// <summary>Предел длины. В справке SDK не документирован — берём заведомо безопасный.</summary>
    public const int MaxLength = 100;

    /// <summary>
    /// Привести имя к виду, пригодному для записи в <c>ksEntity.name</c>: обрезать пробелы по краям,
    /// пустое считать «имя не задано» (<c>null</c> — КОМПАС оставит собственное).
    /// </summary>
    /// <exception cref="ArgumentException">Имя длиннее <see cref="MaxLength"/> или содержит перевод
    /// строки/управляющие символы — в дереве такое имя отображается искажённо.</exception>
    public static string? Normalize(string? name, string parameterName = "name")
    {
        if (name is null) return null;
        var trimmed = name.Trim();
        if (trimmed.Length == 0) return null;

        if (trimmed.Length > MaxLength)
            throw new ArgumentException(
                $"Имя операции длиннее {MaxLength} символов ({trimmed.Length}). " +
                "Дайте короткое имя — оно должно читаться в дереве построения.", parameterName);

        foreach (var c in trimmed)
        {
            if (!char.IsControl(c)) continue;
            throw new ArgumentException(
                "Имя операции не должно содержать перевод строки и управляющие символы.", parameterName);
        }

        return trimmed;
    }
}
