using Kompas6API5;

namespace Kompas.Mcp.Core.Query;

/// <summary>
/// Классификаторы топологических объектов КОМПАС: строковый тип грани и ребра.
/// <para>
/// Каждый вызов COM-метода обёрнут в отдельный <c>try/catch</c> — на экзотической геометрии
/// (NURBS, импортированные STEP-тела) методы класса <c>ksFaceDefinition</c>/<c>ksEdgeDefinition</c>
/// могут бросить <c>COMException</c>, что не должно прерывать bulk-перебор. Ранее этот код
/// был продублирован в <c>QueryService</c> (без защиты) и <c>ModelInspectionService</c> (с защитой).
/// </para>
/// </summary>
internal static class GeomClassifiers
{
    /// <summary>Строковый тип поверхности: plane/cylinder/cone/sphere/torus/nurbs/other.</summary>
    internal static string FaceType(ksFaceDefinition d)
    {
        try { if (d.IsPlanar()) return "plane"; } catch { }
        try { if (d.IsCylinder()) return "cylinder"; } catch { }
        try { if (d.IsCone()) return "cone"; } catch { }
        try { if (d.IsSphere()) return "sphere"; } catch { }
        try { if (d.IsTorus()) return "torus"; } catch { }
        try { if (d.IsNurbsSurface()) return "nurbs"; } catch { }
        return "other";
    }

    /// <summary>Строковый тип кривой: line/circle/arc/ellipse_arc/ellipse/nurbs/other.</summary>
    internal static string EdgeType(ksEdgeDefinition d)
    {
        try { if (d.IsLineSeg()) return "line"; } catch { }
        try { if (d.IsCircle()) return "circle"; } catch { }
        try { if (d.IsArc()) return "arc"; } catch { }
        try { if (d.IsEllipseArc()) return "ellipse_arc"; } catch { }
        try { if (d.IsEllipse()) return "ellipse"; } catch { }
        try { if (d.IsNurbs()) return "nurbs"; } catch { }
        return "other";
    }
}
