using OpenCVForUnity.CoreModule;
using OpenCVForUnity.UtilsModule;
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;

namespace OpenCVForUnity.FaceModule {

    // C++: class BasicFaceRecognizer
    //javadoc: BasicFaceRecognizer

    public class BasicFaceRecognizer : FaceRecognizer {

        protected override void Dispose(bool disposing) {
#if (UNITY_ANDROID && !UNITY_EDITOR)
            try {
                if (disposing) {
                }
                if (IsEnabledDispose) {
                    if (nativeObj != IntPtr.Zero)
                        face_BasicFaceRecognizer_delete(nativeObj);
                    nativeObj = IntPtr.Zero;
                }
            } finally {
                base.Dispose(disposing);
            }
#else
            return;
#endif
        }

        protected internal BasicFaceRecognizer(IntPtr addr) : base(addr) { }

        // internal usage only
        public static new BasicFaceRecognizer __fromPtr__(IntPtr addr) { return new BasicFaceRecognizer(addr); }

        //
        // C++:  Mat cv::face::BasicFaceRecognizer::getEigenValues()
        //

        //javadoc: BasicFaceRecognizer::getEigenValues()
        public Mat getEigenValues() {
            ThrowIfDisposed();
#if (UNITY_ANDROID && !UNITY_EDITOR)

            Mat retVal = new Mat(face_BasicFaceRecognizer_getEigenValues_10(nativeObj));

            return retVal;
#else
            return null;
#endif
        }


        //
        // C++:  Mat cv::face::BasicFaceRecognizer::getEigenVectors()
        //

        //javadoc: BasicFaceRecognizer::getEigenVectors()
        public Mat getEigenVectors() {
            ThrowIfDisposed();
#if (UNITY_ANDROID && !UNITY_EDITOR)

            Mat retVal = new Mat(face_BasicFaceRecognizer_getEigenVectors_10(nativeObj));

            return retVal;
#else
            return null;
#endif
        }


        //
        // C++:  Mat cv::face::BasicFaceRecognizer::getLabels()
        //

        //javadoc: BasicFaceRecognizer::getLabels()
        public Mat getLabels() {
            ThrowIfDisposed();
#if (UNITY_ANDROID && !UNITY_EDITOR)

            Mat retVal = new Mat(face_BasicFaceRecognizer_getLabels_10(nativeObj));

            return retVal;
#else
            return null;
#endif
        }


        //
        // C++:  Mat cv::face::BasicFaceRecognizer::getMean()
        //

        //javadoc: BasicFaceRecognizer::getMean()
        public Mat getMean() {
            ThrowIfDisposed();
#if (UNITY_ANDROID && !UNITY_EDITOR)

            Mat retVal = new Mat(face_BasicFaceRecognizer_getMean_10(nativeObj));

            return retVal;
#else
            return null;
#endif
        }


        //
        // C++:  double cv::face::BasicFaceRecognizer::getThreshold()
        //

        //javadoc: BasicFaceRecognizer::getThreshold()
        public double getThreshold() {
            ThrowIfDisposed();
#if (UNITY_ANDROID && !UNITY_EDITOR)

            double retVal = face_BasicFaceRecognizer_getThreshold_10(nativeObj);

            return retVal;
#else
            return -1;
#endif
        }


        //
        // C++:  int cv::face::BasicFaceRecognizer::getNumComponents()
        //

        //javadoc: BasicFaceRecognizer::getNumComponents()
        public int getNumComponents() {
            ThrowIfDisposed();
#if (UNITY_ANDROID && !UNITY_EDITOR)

            int retVal = face_BasicFaceRecognizer_getNumComponents_10(nativeObj);

            return retVal;
#else
            return -1;
#endif
        }


        //
        // C++:  vector_Mat cv::face::BasicFaceRecognizer::getProjections()
        //

        //javadoc: BasicFaceRecognizer::getProjections()
        public List<Mat> getProjections() {
            ThrowIfDisposed();
#if (UNITY_ANDROID && !UNITY_EDITOR)
            List<Mat> retVal = new List<Mat>();
            Mat retValMat = new Mat(face_BasicFaceRecognizer_getProjections_10(nativeObj));
            Converters.Mat_to_vector_Mat(retValMat, retVal);
            return retVal;
#else
            return null;
#endif
        }


        //
        // C++:  void cv::face::BasicFaceRecognizer::setNumComponents(int val)
        //

        //javadoc: BasicFaceRecognizer::setNumComponents(val)
        public void setNumComponents(int val) {
            ThrowIfDisposed();
#if (UNITY_ANDROID && !UNITY_EDITOR)

            face_BasicFaceRecognizer_setNumComponents_10(nativeObj, val);

            return;
#else
            return;
#endif
        }


        //
        // C++:  void cv::face::BasicFaceRecognizer::setThreshold(double val)
        //

        //javadoc: BasicFaceRecognizer::setThreshold(val)
        public void setThreshold(double val) {
            ThrowIfDisposed();
#if (UNITY_ANDROID && !UNITY_EDITOR)

            face_BasicFaceRecognizer_setThreshold_10(nativeObj, val);

            return;
#else
            return;
#endif
        }



#if (UNITY_ANDROID && !UNITY_EDITOR)
        const string LIBNAME = "opencvforunity";


        // C++:  Mat cv::face::BasicFaceRecognizer::getEigenValues()
        [DllImport(LIBNAME)]
        private static extern IntPtr face_BasicFaceRecognizer_getEigenValues_10(IntPtr nativeObj);

        // C++:  Mat cv::face::BasicFaceRecognizer::getEigenVectors()
        [DllImport(LIBNAME)]
        private static extern IntPtr face_BasicFaceRecognizer_getEigenVectors_10(IntPtr nativeObj);

        // C++:  Mat cv::face::BasicFaceRecognizer::getLabels()
        [DllImport(LIBNAME)]
        private static extern IntPtr face_BasicFaceRecognizer_getLabels_10(IntPtr nativeObj);

        // C++:  Mat cv::face::BasicFaceRecognizer::getMean()
        [DllImport(LIBNAME)]
        private static extern IntPtr face_BasicFaceRecognizer_getMean_10(IntPtr nativeObj);

        // C++:  double cv::face::BasicFaceRecognizer::getThreshold()
        [DllImport(LIBNAME)]
        private static extern double face_BasicFaceRecognizer_getThreshold_10(IntPtr nativeObj);

        // C++:  int cv::face::BasicFaceRecognizer::getNumComponents()
        [DllImport(LIBNAME)]
        private static extern int face_BasicFaceRecognizer_getNumComponents_10(IntPtr nativeObj);

        // C++:  vector_Mat cv::face::BasicFaceRecognizer::getProjections()
        [DllImport(LIBNAME)]
        private static extern IntPtr face_BasicFaceRecognizer_getProjections_10(IntPtr nativeObj);

        // C++:  void cv::face::BasicFaceRecognizer::setNumComponents(int val)
        [DllImport(LIBNAME)]
        private static extern void face_BasicFaceRecognizer_setNumComponents_10(IntPtr nativeObj, int val);

        // C++:  void cv::face::BasicFaceRecognizer::setThreshold(double val)
        [DllImport(LIBNAME)]
        private static extern void face_BasicFaceRecognizer_setThreshold_10(IntPtr nativeObj, double val);

        // native support for java finalize()
        [DllImport(LIBNAME)]
        private static extern void face_BasicFaceRecognizer_delete(IntPtr nativeObj);

#endif

    }
}