namespace Kompas.Mcp.Core.Modeling;

/// <summary>Тип 2D-примитива эскиза.</summary>
public enum SketchEntityKind
{
    Line,
    Circle,
    Rectangle,
    Arc,
    Arc3Points,
    Ellipse,
    Polyline,
    Polygon,
    Spline,
    Point,
    Axis,
    Text,
}

/// <summary>
/// Описание одного примитива эскиза. Пакет таких описаний строится за один заход на STA-поток
/// (<see cref="PartModeler.AddEntitiesAsync"/>), поэтому целый контур обходится одним COM-сеансом
/// вместо вызова на каждую линию.
/// </summary>
public sealed record SketchEntity
{
    public required SketchEntityKind Kind { get; init; }

    /// <summary>Точки в плоскости эскиза (мм): отрезок/ось — 2, прямоугольник — 2 угла,
    /// дуга по трём точкам — 3, ломаная/сплайн — N, точка — 1.</summary>
    public IReadOnlyList<(double X, double Y)> Points { get; init; } = [];

    public double CenterX { get; init; }
    public double CenterY { get; init; }
    public double Radius { get; init; }
    public double StartAngle { get; init; }
    public double EndAngle { get; init; }
    public double SemiMajor { get; init; }
    public double SemiMinor { get; init; }
    public double Angle { get; init; }
    public int VertexCount { get; init; }
    public bool Closed { get; init; }
    public bool CounterClockwise { get; init; } = true;
    public bool Inscribed { get; init; } = true;

    // ---- text ---------------------------------------------------------------

    /// <summary>Содержимое надписи (Kind=Text). Строится шрифтом <see cref="FontName"/>
    /// и сразу переводится в кривые — иначе текст в эскизе не участвует в выдавливании.</summary>
    public string? Text { get; init; }

    /// <summary>Имя установленного в системе шрифта. Пусто — текущий шрифт документа (GOST type A).</summary>
    public string? FontName { get; init; }

    /// <summary>Высота шрифта, мм (Kind=Text).</summary>
    public double Height { get; init; }

    /// <summary>Коэффициент сужения: 1 — нормальная ширина, &lt;1 — уже, &gt;1 — шире.</summary>
    public double WidthFactor { get; init; } = 1.0;

    public bool Bold { get; init; }
    public bool Italic { get; init; }
}
