using System;
using OpenCvSharp;

namespace OpenCVStudio_v0
{
    /// <summary>
    /// Результаты вычисления минимальных
    /// повёрнутых прямоугольников контуров.
    ///
    /// Индекс прямоугольника соответствует
    /// индексу контура в ContourData.Contours.
    /// </summary>
    public sealed class MinAreaRectData
    {
        public MinAreaRectData(RotatedRect[] rectangles)
        {
            Rectangles = rectangles ?? throw new ArgumentNullException(nameof(rectangles));
        }

        /// <summary>
        /// Повёрнутые прямоугольники
        /// для всех контуров.
        /// </summary>
        public RotatedRect[] Rectangles { get; }

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

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

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

        /// <summary>
        /// Возвращает четыре вершины прямоугольника.
        /// </summary>
        public Point2f[] GetPoints(int contourIndex)
        {
            RotatedRect rectangle = GetRectangle(contourIndex);
            return rectangle.Points();
        }

        /// <summary>
        /// Возвращает площадь повёрнутого прямоугольника.
        /// </summary>
        public double GetArea(int contourIndex)
        {
            RotatedRect rectangle = GetRectangle(contourIndex);
            return rectangle.Size.Width * rectangle.Size.Height;
        }
    }
}