using System;
using OpenCvSharp;

namespace OpenCVStudio_v0
{
    internal sealed class AlignImageExecutor : IPipelineBlockExecutor
    {
        public string BlockType => "AlignImage";

        public void Execute(PipelineContext context, ProjectBlock block, ProjectManager projectManager)
        {
            ArgumentNullException.ThrowIfNull(context);
            ArgumentNullException.ThrowIfNull(block);
            if (context.TransformMatrix == null)
            {
                throw new InvalidOperationException("Перед AlignImage должен выполняться FindTransformECC.");
            }
            Mat matrix = context.TransformMatrix.Matrix;
            Mat result = new Mat();
            Scalar border = new Scalar(255, 255, 255);
            if (matrix.Rows == 2 && matrix.Cols == 3)
            {
                Cv2.WarpAffine(context.Image, result, matrix, context.Image.Size(), InterpolationFlags.Linear, BorderTypes.Constant, border);
            }
            else
            {
                Cv2.WarpPerspective(context.Image, result, matrix, context.Image.Size(), InterpolationFlags.Linear, BorderTypes.Constant, border);
            }
            context.ReplaceImage(result);
            context.ResultText = "Изображение выровнено по ECC.";
        }
    }
}