using Kompas6Constants3D;

namespace Kompas.Mcp.Core.Assemblies;

/// <summary>
/// Дружелюбный тип сопряжения (обёртка над <see cref="MateConstraintType"/>). Пока поддержаны только
/// геометрически проверенные типы — совпадение и расстояние; остальные (параллельность, соосность,
/// угол и т.д.) добавятся в следующих инкрементах вместе с тестами.
/// </summary>
public enum MateType
{
    /// <summary>Совпадение (грани лежат на одной плоскости, заподлицо).</summary>
    Coincidence,
    /// <summary>На расстоянии (постоянный зазор между гранями, мм).</summary>
    Distance,
}

/// <summary>Маппинг дружелюбного типа сопряжения ↔ перечисление API КОМПАС и разбор строки.</summary>
public static class Mates
{
    /// <summary>Сопряжения, которым нужно числовое значение (<c>ParamValue</c>): расстояние.</summary>
    public static bool RequiresValue(MateType type) => type is MateType.Distance;

    public static MateConstraintType ToConstraintType(MateType type) => type switch
    {
        MateType.Coincidence => MateConstraintType.mc_Coincidence,
        MateType.Distance => MateConstraintType.mc_Distance,
        _ => throw new ArgumentOutOfRangeException(nameof(type), type, "Неизвестный тип сопряжения."),
    };

    /// <summary>Разобрать строку типа сопряжения (англ./рус.) в <see cref="MateType"/>.</summary>
    public static MateType Parse(string value)
    {
        ArgumentNullException.ThrowIfNull(value);
        return value.Trim().ToLowerInvariant() switch
        {
            "coincidence" or "coincident" or "совпадение" => MateType.Coincidence,
            "distance" or "расстояние" => MateType.Distance,
            _ => throw new ArgumentException(
                $"Неизвестный/неподдерживаемый тип сопряжения '{value}'. Сейчас поддержаны: " +
                "coincidence (совпадение), distance (расстояние).", nameof(value)),
        };
    }
}
