using System;

namespace OpenCVStudio_v0
{
    /// <summary>
    /// Результаты вычисления длины контуров.
    ///
    /// Индекс длины соответствует индексу контура
    /// в ContourData.Contours.
    /// </summary>
    public sealed class ArcLengthData
    {
        public ArcLengthData(double[] lengths)
        {
            Lengths = lengths ?? throw new ArgumentNullException(nameof(lengths));
        }

        /// <summary>
        /// Длины всех контуров.
        /// </summary>
        public double[] Lengths { get; }

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

        /// <summary>
        /// Есть ли рассчитанные значения.
        /// </summary>
        public bool IsEmpty => Lengths.Length == 0;

        /// <summary>
        /// Минимальная длина контура.
        /// </summary>
        public double MinimumLength
        {
            get
            {
                if (Lengths.Length == 0) return 0;
                double minimum = Lengths[0];
                for (int index = 1; index < Lengths.Length; index++)
                {
                    if (Lengths[index] < minimum) minimum = Lengths[index];
                }
                return minimum;
            }
        }

        /// <summary>
        /// Максимальная длина контура.
        /// </summary>
        public double MaximumLength
        {
            get
            {
                if (Lengths.Length == 0) return 0;
                double maximum = Lengths[0];
                for (int index = 1; index < Lengths.Length; index++)
                {
                    if (Lengths[index] > maximum) maximum = Lengths[index];
                }
                return maximum;
            }
        }

        /// <summary>
        /// Суммарная длина всех контуров.
        /// </summary>
        public double TotalLength
        {
            get
            {
                double total = 0;
                foreach (double length in Lengths) total += length;
                return total;
            }
        }

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