using Kompas6Constants;

namespace Kompas.Mcp.Core.Drawings;

/// <summary>Тип углового размера — какой из двух секторов измерять
/// (обёртка над <see cref="ksAngleDimTypeEnum"/>).</summary>
public enum AngleDimensionType
{
    /// <summary>Минимальный (острый) угол.</summary>
    Min,
    /// <summary>Максимальный (тупой) угол.</summary>
    Max,
    /// <summary>Угол более 180° (рефлексный).</summary>
    More,
}

/// <summary>Маппинг типа углового размера ↔ перечисление КОМПАС и разбор строки.</summary>
public static class AngleDimensionTypes
{
    public static ksAngleDimTypeEnum ToKompas(AngleDimensionType type) => type switch
    {
        AngleDimensionType.Min => ksAngleDimTypeEnum.ksADMinAngle,
        AngleDimensionType.Max => ksAngleDimTypeEnum.ksADMaxAngle,
        AngleDimensionType.More => ksAngleDimTypeEnum.ksADMoreAngle,
        _ => throw new ArgumentOutOfRangeException(nameof(type), type, "Неизвестный тип углового размера."),
    };

    /// <summary>Разобрать строку типа углового размера (англ./рус.) в <see cref="AngleDimensionType"/>.</summary>
    public static AngleDimensionType Parse(string value)
    {
        ArgumentNullException.ThrowIfNull(value);
        return value.Trim().ToLowerInvariant() switch
        {
            "min" or "minimal" or "минимальный" or "острый" => AngleDimensionType.Min,
            "max" or "maximal" or "максимальный" or "тупой" => AngleDimensionType.Max,
            "more" or "more180" or "больше180" or "рефлексный" => AngleDimensionType.More,
            _ => throw new ArgumentException(
                $"Неизвестный тип углового размера '{value}'. Допустимо: min, max, more.",
                nameof(value)),
        };
    }
}
