using System;
using OpenCvSharp;

namespace OpenCVStudio_v0
{
    /// <summary>
    /// Вычисляет квадратный корень каждого пикселя.
    /// Cv2.Sqrt.
    /// </summary>
    public sealed class SqrtExecutor : IImageBlockExecutor
    {
        public string BlockType => "Sqrt";

        public Mat Execute(Mat input, ProjectBlock block, ProjectManager projectManager)
        {
            ArgumentNullException.ThrowIfNull(input);
            ArgumentNullException.ThrowIfNull(block);
            ArgumentNullException.ThrowIfNull(projectManager);
            if (input.Empty())
            {
                throw new ArgumentException("В блок Sqrt передано пустое изображение.", nameof(input));
            }
            Mat floatImage = new Mat();
            Mat sqrtImage = new Mat();
            Mat output = new Mat();
            try
            {
                input.ConvertTo(floatImage, MatType.CV_32F);
                Cv2.Sqrt(floatImage, sqrtImage);
                sqrtImage.ConvertTo(output, input.Type());
                if (output.Empty())
                {
                    throw new InvalidOperationException($"Блок «{block.Name}» вернул пустое изображение.");
                }
                return output;
            }
            catch
            {
                output.Dispose();
                throw;
            }
            finally
            {
                floatImage.Dispose();
                sqrtImage.Dispose();
            }
        }
    }
}