using System;
using OpenCvSharp;

namespace OpenCVStudio_v0
{
    /// <summary>
    /// Результаты аппроксимации контуров эллипсами.
    ///
    /// Индекс элемента соответствует индексу контура
    /// в ContourData.Contours.
    ///
    /// Значение null означает, что эллипс невозможно
    /// рассчитать, например, если в контуре меньше 5 точек.
    /// </summary>
    public sealed class FitEllipseData
    {
        public FitEllipseData(RotatedRect?[] ellipses)
        {
            Ellipses = ellipses ?? throw new ArgumentNullException(nameof(ellipses));
        }

        /// <summary>
        /// Рассчитанные эллипсы.
        /// </summary>
        public RotatedRect?[] Ellipses { get; }

        /// <summary>
        /// Количество исходных контуров.
        /// </summary>
        public int Count => Ellipses.Length;

        /// <summary>
        /// Количество успешно рассчитанных эллипсов.
        /// </summary>
        public int ValidCount
        {
            get
            {
                int count = 0;
                foreach (RotatedRect? ellipse in Ellipses)
                {
                    if (ellipse.HasValue)
                    {
                        count++;
                    }
                }
                return count;
            }
        }

        /// <summary>
        /// Есть ли хотя бы один рассчитанный эллипс.
        /// </summary>
        public bool IsEmpty => ValidCount == 0;

        /// <summary>
        /// Возвращает эллипс по индексу контура.
        /// </summary>
        public RotatedRect? GetEllipse(int contourIndex)
        {
            if (contourIndex < 0 || contourIndex >= Ellipses.Length)
            {
                throw new ArgumentOutOfRangeException(nameof(contourIndex), contourIndex, "Индекс контура находится вне допустимого диапазона.");
            }
            return Ellipses[contourIndex];
        }
    }
}