using System;
using OpenCvSharp;
namespace OpenCVStudio_v0
{
    public sealed class FlipExecutor : IImageBlockExecutor
    {
        public string BlockType => "Flip";
        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));
            ImageFlipMode mode = projectManager.GetBlockParameter(block.Id, "Mode", ImageFlipMode.Horizontal);
            ValidateMode(mode);
            FlipMode flipMode = ConvertFlipMode(mode);
            Mat output = new Mat();
            try
            {
                Cv2.Flip(input, output, flipMode);
                if (output.Empty()) throw new InvalidOperationException("Блок зеркального отражения вернул пустое изображение.");
                return output;
            }
            catch { output.Dispose(); throw; }
        }
        private static FlipMode ConvertFlipMode(ImageFlipMode mode)
        {
            return mode switch
            {
                ImageFlipMode.Horizontal => FlipMode.Y,
                ImageFlipMode.Vertical => FlipMode.X,
                ImageFlipMode.Both => FlipMode.XY,
                _ => throw new ArgumentOutOfRangeException(nameof(mode), mode, "Неизвестное направление отражения.")
            };
        }
        private static void ValidateMode(ImageFlipMode mode)
        {
            if (!Enum.IsDefined(mode)) throw new ArgumentOutOfRangeException(nameof(mode), mode, "Неизвестное направление отражения.");
        }
    }
}