namespace Kompas.Mcp.Core.Drawings;

/// <summary>Геометрия окружности-кандидата вида (центр + радиус, локальная СК вида, мм).</summary>
public sealed record CircleCandidate(double Xc, double Yc, double Radius);

/// <summary>
/// Чистый отбор окружности проекционного вида по ключу (центр + радиус) для ассоциативной привязки
/// размера. Выделен из COM-перечисления ради unit-тестов.
/// </summary>
public static class CircularObjectMatch
{
    /// <summary>
    /// Индекс единственной окружности из <paramref name="candidates"/>, чей центр и радиус совпадают с
    /// ключом (<paramref name="keyX"/>,<paramref name="keyY"/>,<paramref name="keyR"/>) в пределах
    /// <paramref name="tol"/> (мм): <c>dist(центр,ключ) ≤ tol</c> И <c>|R − keyR| ≤ tol</c>.
    /// </summary>
    /// <exception cref="InvalidOperationException">Нет подходящих (0) или неоднозначно (&gt;1).</exception>
    public static int SelectMatchIndex(IReadOnlyList<CircleCandidate> candidates,
        double keyX, double keyY, double keyR, double tol)
    {
        ArgumentNullException.ThrowIfNull(candidates);

        var matches = new List<int>();
        for (var i = 0; i < candidates.Count; i++)
        {
            var c = candidates[i];
            var dx = c.Xc - keyX;
            var dy = c.Yc - keyY;
            if (Math.Sqrt(dx * dx + dy * dy) <= tol && Math.Abs(c.Radius - keyR) <= tol)
                matches.Add(i);
        }

        return matches.Count switch
        {
            1 => matches[0],
            0 => throw new InvalidOperationException(
                $"Окружность не найдена рядом с ({keyX},{keyY}) R≈{keyR} (допуск {tol} мм). " +
                "Проверьте координаты/радиус и наличие окружности на этом виде."),
            _ => throw new InvalidOperationException(
                $"Неоднозначный выбор окружности у ({keyX},{keyY}) R≈{keyR}: подходит {matches.Count}. " +
                "Уточните координаты/радиус."),
        };
    }
}
