using System;

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

        /// <summary>
        /// Площади всех контуров.
        /// </summary>
        public double[] Areas { get; }

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

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

        /// <summary>
        /// Минимальная площадь.
        /// </summary>
        public double MinimumArea
        {
            get
            {
                if (Areas.Length == 0)
                    return 0;

                double minimum = Areas[0];

                for (int index = 1; index < Areas.Length; index++)
                {
                    if (Areas[index] < minimum)
                        minimum = Areas[index];
                }

                return minimum;
            }
        }

        /// <summary>
        /// Максимальная площадь.
        /// </summary>
        public double MaximumArea
        {
            get
            {
                if (Areas.Length == 0)
                    return 0;

                double maximum = Areas[0];

                for (int index = 1; index < Areas.Length; index++)
                {
                    if (Areas[index] > maximum)
                        maximum = Areas[index];
                }

                return maximum;
            }
        }

        /// <summary>
        /// Общая площадь всех контуров.
        /// </summary>
        public double TotalArea
        {
            get
            {
                double total = 0;

                foreach (double area in Areas)
                    total += area;

                return total;
            }
        }

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

            return Areas[contourIndex];
        }
    }
}