using System;
using System.Collections.Generic;
using System.Text;

using System;
using OpenCvSharp;
namespace OpenCVStudio_v0
{
    public sealed class BrightnessContrastExecutor : IImageBlockExecutor
    {
        public string BlockType => "BrightnessContrast";
        public Mat Execute(Mat input, ProjectBlock block, ProjectManager projectManager)
        {
            ArgumentNullException.ThrowIfNull(input);
            ArgumentNullException.ThrowIfNull(block);
            ArgumentNullException.ThrowIfNull(projectManager);
            if (input.Empty()) throw new ArgumentException("В блок яркости и контраста передано пустое изображение.", nameof(input));
            double contrast = projectManager.GetBlockParameter(block.Id, "Contrast", 1.0);
            double brightness = projectManager.GetBlockParameter(block.Id, "Brightness", 0.0);
            ValidateParameters(contrast, brightness);
            Mat output = new Mat();
            try
            {
                input.ConvertTo(output, input.Type(), contrast, brightness);
                if (output.Empty()) throw new InvalidOperationException("Блок яркости и контраста вернул пустое изображение.");
                return output;
            }
            catch { output.Dispose(); throw; }
        }
        private static void ValidateParameters(double contrast, double brightness)
        {
            if (double.IsNaN(contrast) || double.IsInfinity(contrast) || contrast < 0 || contrast > 10)
                throw new ArgumentException("Контраст должен находиться в диапазоне от 0 до 10.");
            if (double.IsNaN(brightness) || double.IsInfinity(brightness) || brightness < -255 || brightness > 255)
                throw new ArgumentException("Яркость должна находиться в диапазоне от -255 до 255.");
        }
    }
}