using System.ComponentModel;
using System.Text.Json.Serialization;

namespace Kompas.Mcp.Core.Modeling;

/// <summary>
/// Точка на объекте модели во входе инструмента (мировые координаты, мм). Нужна там, где объекты
/// выбираются пакетом: список рёбер под одно скругление — это одна операция в дереве вместо N.
/// </summary>
public sealed class Point3dInput
{
    [JsonPropertyName("x")]
    [Description("X точки, мм")]
    public double X { get; set; }

    [JsonPropertyName("y")]
    [Description("Y точки, мм")]
    public double Y { get; set; }

    [JsonPropertyName("z")]
    [Description("Z точки, мм")]
    public double Z { get; set; }
}

/// <summary>Разбор списка точек из входа инструмента.</summary>
public static class Point3dInputs
{
    /// <summary>Преобразовать вход в точки модели, проверив конечность координат.</summary>
    public static IReadOnlyList<Point3d> Parse(IReadOnlyList<Point3dInput>? points, string parameterName = "points")
    {
        if (points is null || points.Count == 0) return [];

        var parsed = new List<Point3d>(points.Count);
        for (var i = 0; i < points.Count; i++)
        {
            var p = points[i] ?? throw new ArgumentException($"Точка [{i}] пустая.", parameterName);
            if (!double.IsFinite(p.X) || !double.IsFinite(p.Y) || !double.IsFinite(p.Z))
                throw new ArgumentException($"Точка [{i}]: координаты должны быть конечными числами.", parameterName);
            parsed.Add(new Point3d(p.X, p.Y, p.Z));
        }

        return parsed;
    }
}
