using System;
using System.Drawing;
using OpenCvSharp;
using OpenCvSharp.Extensions;

namespace LensAdjustmentTool.Processing
{
    public static class FocusAnalyzer
    {
        public static double CalculateScore(Bitmap focusRoi)
        {
            if (focusRoi == null) throw new ArgumentNullException(nameof(focusRoi));

            using (Mat src = BitmapConverter.ToMat(focusRoi))
            using (Mat gray = new Mat())
            using (Mat gx = new Mat())
            using (Mat gy = new Mat())
            using (Mat absX = new Mat())
            using (Mat absY = new Mat())
            using (Mat gradient = new Mat())
            {
                Cv2.CvtColor(src, gray, ColorConversionCodes.BGR2GRAY);

                Cv2.Sobel(gray, gx, MatType.CV_32F, 1, 0, 3);
                Cv2.Sobel(gray, gy, MatType.CV_32F, 0, 1, 3);

                Cv2.Absdiff(gx, Scalar.All(0), absX);
                Cv2.Absdiff(gy, Scalar.All(0), absY);

                Cv2.AddWeighted(absX, 0.5, absY, 0.5, 0.0, gradient);
                return Cv2.Mean(gradient).Val0;
            }
        }
    }
}
