using System;
using OpenCvSharp;

namespace OpenCVStudio_v0
{
    /// <summary>
    /// Разделяет цветное изображение
    /// на отдельные каналы.
    ///
    /// Вход:
    /// context.Image
    ///
    /// Выход:
    /// context.Channels
    ///
    /// Индексы:
    /// 0 - Blue
    /// 1 - Green
    /// 2 - Red
    /// </summary>
    internal sealed class SplitChannelsExecutor : IChannelCollectionBlockExecutor
    {
        public string BlockType => "SplitChannels";

        public void Execute(PipelineContext context, ProjectBlock block, ProjectManager projectManager)
        {
            ArgumentNullException.ThrowIfNull(context);
            ArgumentNullException.ThrowIfNull(block);
            ArgumentNullException.ThrowIfNull(projectManager);
            if (!context.HasImage)
            {
                throw new InvalidOperationException($"Блок «{block.Name}» не получил изображение.");
            }
            Mat input = context.Image;
            if (input.Channels() != 3)
            {
                throw new InvalidOperationException($"Блок «{block.Name}» принимает только цветное BGR изображение.\n\nПолучено каналов: {input.Channels()}.");
            }
            Mat[] channels = Cv2.Split(input);
            try
            {
                context.ReplaceChannels(channels);
                context.ResultText = "Изображение разделено на цветовые каналы.";
            }
            catch
            {
                foreach (Mat channel in channels)
                {
                    channel.Dispose();
                }
                throw;
            }
        }
    }
}