using Kompas6Constants;

namespace Kompas.Mcp.Core.Drawings;

/// <summary>Тип знака шероховатости (обёртка над <see cref="ksRoughSignEnum"/>).</summary>
public enum RoughSignType
{
    /// <summary>Без указания вида обработки.</summary>
    NoProcessing,
    /// <summary>С удалением слоя материала.</summary>
    DeleteMaterial,
    /// <summary>Без удаления слоя материала.</summary>
    WithoutDeleteMaterial,
}

/// <summary>Маппинг типа знака шероховатости ↔ перечисление КОМПАС и разбор строки.</summary>
public static class RoughSignTypes
{
    public static ksRoughSignEnum ToKompas(RoughSignType type) => type switch
    {
        RoughSignType.NoProcessing => ksRoughSignEnum.ksNoProcessingType,
        RoughSignType.DeleteMaterial => ksRoughSignEnum.ksDeleteMaterial,
        RoughSignType.WithoutDeleteMaterial => ksRoughSignEnum.ksWithoutDeleteMaterial,
        _ => throw new ArgumentOutOfRangeException(nameof(type), type, "Неизвестный тип знака шероховатости."),
    };

    /// <summary>Разобрать строку типа знака (англ./рус.) в <see cref="RoughSignType"/>.</summary>
    public static RoughSignType Parse(string value)
    {
        ArgumentNullException.ThrowIfNull(value);
        return value.Trim().ToLowerInvariant() switch
        {
            "delete" or "deletematerial" or "с удалением" or "с удалением материала" => RoughSignType.DeleteMaterial,
            "without" or "withoutdelete" or "без удаления" or "без удаления материала" => RoughSignType.WithoutDeleteMaterial,
            "none" or "noprocessing" or "без указания" or "любая" => RoughSignType.NoProcessing,
            _ => throw new ArgumentException(
                $"Неизвестный тип знака шероховатости '{value}'. Допустимо: delete, without, none.",
                nameof(value)),
        };
    }
}
