using System;
using OpenCvSharp;

namespace OpenCVStudio_v0
{
    /// <summary>
    /// Вычисляет минимальную окружность,
    /// описывающую каждый найденный контур.
    /// </summary>
    internal sealed class MinEnclosingCircleExecutor : IPipelineBlockExecutor
    {
        public string BlockType => "MinEnclosingCircle";

        public void Execute(PipelineContext context, ProjectBlock block, ProjectManager projectManager)
        {
            ArgumentNullException.ThrowIfNull(context);
            ArgumentNullException.ThrowIfNull(block);
            ArgumentNullException.ThrowIfNull(projectManager);
            if (context.Contours == null)
            {
                throw new InvalidOperationException($"Блок «{block.Name}»: отсутствуют контуры. Перед ним должен выполняться FindContours.");
            }
            ContourData contourData = context.Contours;
            OpenCvSharp.Point[][] contours = contourData.Contours;
            EnclosingCircle[] circles = new EnclosingCircle[contours.Length];
            for (int i = 0; i < contours.Length; i++)
            {
                OpenCvSharp.Point[] contour = contours[i];
                if (contour == null || contour.Length == 0)
                {
                    circles[i] = new EnclosingCircle(new Point2f(0, 0), 0);
                    continue;
                }
                Cv2.MinEnclosingCircle(contour, out Point2f center, out float radius);
                circles[i] = new EnclosingCircle(center, radius);
            }
            context.MinEnclosingCircles = new MinEnclosingCircleData(circles);
            context.ResultText = $"Рассчитано описанных окружностей: {circles.Length}";
        }
    }
}