using System;
using OpenCvSharp;

namespace OpenCVStudio_v0
{
    /// <summary>
    /// Хранит ограничивающие прямоугольники контуров.
    ///
    /// Индекс прямоугольника соответствует индексу контура
    /// в объекте ContourData.
    /// </summary>
    public sealed class BoundingRectData
    {
        public BoundingRectData(Rect[] rectangles)
        {
            Rectangles = rectangles ?? throw new ArgumentNullException(nameof(rectangles));
        }

        /// <summary>
        /// Ограничивающие прямоугольники контуров.
        /// </summary>
        public Rect[] Rectangles { get; }

        /// <summary>
        /// Количество прямоугольников.
        /// </summary>
        public int Count => Rectangles.Length;

        /// <summary>
        /// Показывает, отсутствуют ли прямоугольники.
        /// </summary>
        public bool IsEmpty => Rectangles.Length == 0;

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

        /// <summary>
        /// Возвращает прямоугольник с наибольшей площадью.
        /// Если прямоугольников нет, возвращает Rect.Empty.
        /// </summary>
        public Rect GetLargestRectangle()
        {
            if (Rectangles.Length == 0) return new Rect();
            Rect largestRectangle = Rectangles[0];
            long largestArea = GetRectangleArea(largestRectangle);
            for (int index = 1; index < Rectangles.Length; index++)
            {
                Rect currentRectangle = Rectangles[index];
                long currentArea = GetRectangleArea(currentRectangle);
                if (currentArea > largestArea)
                {
                    largestRectangle = currentRectangle;
                    largestArea = currentArea;
                }
            }
            return largestRectangle;
        }

        /// <summary>
        /// Возвращает индекс прямоугольника
        /// с наибольшей площадью.
        ///
        /// Если прямоугольников нет, возвращает -1.
        /// </summary>
        public int GetLargestRectangleIndex()
        {
            if (Rectangles.Length == 0) return -1;
            int largestIndex = 0;
            long largestArea = GetRectangleArea(Rectangles[0]);
            for (int index = 1; index < Rectangles.Length; index++)
            {
                long currentArea = GetRectangleArea(Rectangles[index]);
                if (currentArea > largestArea)
                {
                    largestIndex = index;
                    largestArea = currentArea;
                }
            }
            return largestIndex;
        }

        /// <summary>
        /// Возвращает площадь прямоугольника.
        /// Используется long, чтобы избежать переполнения int.
        /// </summary>
        private static long GetRectangleArea(Rect rectangle)
        {
            return (long)rectangle.Width * rectangle.Height;
        }
    }
}