"""Maps OpenCV namespace paths to the Elixir module names they emit as.

Most OpenCV namespaces map mechanically (`cv::Foo` -> `Evision.Foo`) but a
handful of cases need hand-picked overrides for ergonomics:

  * Abbreviations / acronyms that look ugly title-cased (`dnn` -> `DNN`,
    `ml` -> `ML`, `ccm` -> `CCM`).
  * Multi-word names where the natural splits aren't on `_`
    (`ximgproc` -> `XImgProc`, signaling "extension" + "img" + "proc").
  * Nested enum types whose containing class is itself overridden.

This dict was previously inlined inside `gen2.add_const`; it is consulted
once per parsed enum so re-creating it on every call wasted memory.
"""

# Keys are the original OpenCV path with the leading `cv.` stripped.
NAMESPACE_TO_ELIXIR_MODULE = {
    'aruco.CornerRefineMethod': 'Evision.ArUco.CornerRefineMethod',
    'aruco.PatternPositionType': 'Evision.ArUco.PatternPositionType',
    'aruco.PredefinedDictionaryType': 'Evision.ArUco.PredefinedDictionaryType',
    'bgsegm.LSBPCameraMotionCompensation': 'Evision.BgSegm.LSBPCameraMotionCompensation',
    'bioinspired': 'Evision.Bioinspired',
    'ccm.CCM_TYPE': 'Evision.CCM.CCM_TYPE',
    'ccm.COLOR_SPACE': 'Evision.CCM.COLOR_SPACE',
    'ccm.CONST_COLOR': 'Evision.CCM.CONST_COLOR',
    'ccm.DISTANCE_TYPE': 'Evision.CCM.DISTANCE_TYPE',
    'ccm.INITIAL_METHOD_TYPE': 'Evision.CCM.INITIAL_METHOD_TYPE',
    'ccm.LINEAR_TYPE': 'Evision.CCM.LINEAR_TYPE',
    'cuda.SURF_CUDA.KeypointLayout': 'Evision.CUDA.SURF_CUDA.KeypointLayout',
    'cuda.DemosaicTypes': 'Evision.CUDA.DemosaicTypes',
    'cuda.AlphaCompTypes': 'Evision.CUDA.AlphaCompTypes',
    'cuda.ConnectedComponentsAlgorithmsTypes': 'Evision.CUDA.ConnectedComponentsAlgorithmsTypes',
    'cuda.MomentsOrder': 'Evision.CUDA.MomentsOrder',
    # cudaoptflow (NVIDIA OF) — module name drops the `_1_0`/`_2_0` underscores
    # to match pipeline.get_module_writer's projection.
    'cuda.NvidiaOpticalFlow_1_0.NVIDIA_OF_PERF_LEVEL': 'Evision.CUDA.NvidiaOpticalFlow10.NVIDIA_OF_PERF_LEVEL',
    'cuda.NvidiaOpticalFlow_2_0.NVIDIA_OF_PERF_LEVEL': 'Evision.CUDA.NvidiaOpticalFlow20.NVIDIA_OF_PERF_LEVEL',
    'cuda.NvidiaOpticalFlow_2_0.NVIDIA_OF_OUTPUT_VECTOR_GRID_SIZE': 'Evision.CUDA.NvidiaOpticalFlow20.NVIDIA_OF_OUTPUT_VECTOR_GRID_SIZE',
    'cuda.NvidiaOpticalFlow_2_0.NVIDIA_OF_HINT_VECTOR_GRID_SIZE': 'Evision.CUDA.NvidiaOpticalFlow20.NVIDIA_OF_HINT_VECTOR_GRID_SIZE',
    'cudacodec.Codec': 'Evision.CUDACodec.Codec',
    'cudacodec.ColorFormat': 'Evision.CUDACodec.ColorFormat',
    'cudacodec.EncodeParamsRcMode': 'Evision.CUDACodec.EncodeParamsRcMode',
    'cudacodec.EncodeMultiPass': 'Evision.CUDACodec.EncodeMultiPass',
    'cudacodec.EncodeProfile': 'Evision.CUDACodec.EncodeProfile',
    'cudacodec.EncodePreset': 'Evision.CUDACodec.EncodePreset',
    'cudacodec.EncodeTuningInfo': 'Evision.CUDACodec.EncodeTuningInfo',
    'cudacodec.ChromaFormat': 'Evision.CUDACodec.ChromaFormat',
    'cudacodec.DeinterlaceMode': 'Evision.CUDACodec.DeinterlaceMode',
    'cudacodec.VideoReaderProps': 'Evision.CUDACodec.VideoReaderProps',
    'cudacodec.BitDepth': 'Evision.CUDACodec.BitDepth',
    'cudacodec.SurfaceFormat': 'Evision.CUDACodec.SurfaceFormat',
    'cudacodec.ColorSpaceStandard': 'Evision.CUDACodec.ColorSpaceStandard',
    'datasets.actionType': 'Evision.Datasets.ActionType',
    'datasets.backgroundType': 'Evision.Datasets.BackgroundType',
    'datasets.datasetType': 'Evision.Datasets.DatasetType',
    'datasets.genderType': 'Evision.Datasets.GenderType',
    'datasets.illuminationType': 'Evision.Datasets.IlluminationType',
    'datasets.imageType': 'Evision.Datasets.ImageType',
    'datasets.poseType': 'Evision.Datasets.PoseType',
    'datasets.sampleType': 'Evision.Datasets.SampleType',
    'detail.Blender': 'Evision.Detail.Blender',
    'detail.CvFeatureParams.FeatureType': 'Evision.Detail.CvFeatureParams.FeatureType',
    'detail.DpSeamFinder.CostFunction': 'Evision.Detail.DpSeamFinder.CostFunction',
    'detail.ExposureCompensator': 'Evision.Detail.ExposureCompensator',
    'detail.GraphCutSeamFinderBase.CostType': 'Evision.Detail.GraphCutSeamFinderBase.CostType',
    'detail.SeamFinder': 'Evision.Detail.SeamFinder',
    'detail.Timelapser': 'Evision.Detail.Timelapser',
    'detail.TrackerContribSamplerCSC': 'Evision.Detail.TrackerContribSamplerCSC',
    'detail.TrackerSamplerCS': 'Evision.Detail.TrackerSamplerCS',
    'detail.TrackerSamplerCSC.MODE': 'Evision.Detail.TrackerSamplerCSC.MODE',
    'detail.WaveCorrectKind': 'Evision.Detail.WaveCorrectKind',
    'fisheye': 'Evision.FishEye',
    'ft': 'Evision.Ft',
    'flann': 'Evision.Flann',
    'flann.flann_algorithm_t': 'Evision.Flann.Algorithm',
    'flann.flann_centers_init_t': 'Evision.Flann.CentersInit',
    'flann.flann_log_level_t': 'Evision.Flann.LogLevel',
    'flann.flann_distance_t': 'Evision.Flann.Distance',
    'flann.flann_datatype_t': 'Evision.Flann.Datatype',
    'kinfu.VolumeType': 'Evision.KinFu.VolumeType',
    'mcc.TYPECHART': 'Evision.MCC.TYPECHART',
    'ml.LogisticRegression.Methods': 'Evision.ML.LogisticRegression.Methods',
    'ml.SVMSGD.MarginType': 'Evision.ML.SVMSGD.MarginType',
    'multicalib.MultiCameraCalibration': 'Evision.MultiCalib.MultiCameraCalibration',
    'omnidir': 'Evision.Omnidir',
    'optflow.GPCDescType': 'Evision.OptFlow.GPCDescType',
    'optflow.InterpolationType': 'Evision.OptFlow.InterpolationType',
    'optflow.SolverType': 'Evision.OptFlow.SolverType',
    'optflow.SupportRegionType': 'Evision.OptFlow.SupportRegionType',
    'rgbd.DepthCleaner.DEPTH_CLEANER_METHOD': 'Evision.RGBD.DepthCleaner.DEPTH_CLEANER_METHOD',
    'rgbd.Odometry': 'Evision.RGBD.Odometry',
    'rgbd.OdometryFrame': 'Evision.RGBD.OdometryFrame',
    'rgbd.RgbdNormals.RGBD_NORMALS_METHOD': 'Evision.RGBD.RgbdNormals.RGBD_NORMALS_METHOD',
    'rgbd.RgbdPlane.RGBD_PLANE_METHOD': 'Evision.RGBD.RgbdPlane.RGBD_PLANE_METHOD',
    'stereo.StereoBinaryBM': 'Evision.Stereo.StereoBinaryBM',
    'stereo.StereoBinarySGBM': 'Evision.Stereo.StereoBinarySGBM',
    'stereo.StereoMatcher': 'Evision.Stereo.StereoMatcher',
    'text': 'Evision.Text',
    'text.classifier_type': 'Evision.Text.ClassifierType',
    'text.decoder_mode': 'Evision.Text.DecoderMode',
    'text.erGrouping_Modes': 'Evision.Text.ERGroupingModes',
    'text.ocr_engine_mode': 'Evision.Text.OCREngineMode',
    'text.page_seg_mode': 'Evision.Text.PageSegMode',
    'videostab.MotionModel': 'Evision.VideoStab.MotionModel',
    'xfeatures2d.BEBLID.BeblidSize': 'Evision.XFeatures2D.BEBLID.BeblidSize',
    'xfeatures2d.DAISY.NormalizationType': 'Evision.XFeatures2D.DAISY.NormalizationType',
    'xfeatures2d.PCTSignatures.DistanceFunction': 'Evision.XFeatures2D.PCTSignatures.DistanceFunction',
    'xfeatures2d.PCTSignatures.PointDistribution': 'Evision.XFeatures2D.PCTSignatures.PointDistribution',
    'xfeatures2d.PCTSignatures.SimilarityFunction': 'Evision.XFeatures2D.PCTSignatures.SimilarityFunction',
    'xfeatures2d.TEBLID.TeblidSize': 'Evision.XFeatures2D.TEBLID.TeblidSize',
    'ximgproc.AngleRangeOption': 'Evision.XImgProc.AngleRangeOption',
    'ximgproc.EdgeAwareFiltersList': 'Evision.XImgProc.EdgeAwareFiltersList',
    'ximgproc.EdgeDrawing.GradientOperator': 'Evision.XImgProc.EdgeDrawing.GradientOperator',
    'ximgproc.HoughDeskewOption': 'Evision.XImgProc.HoughDeskewOption',
    'ximgproc.HoughOp': 'Evision.XImgProc.HoughOp',
    'ximgproc.LocalBinarizationMethods': 'Evision.XImgProc.LocalBinarizationMethods',
    'ximgproc.SLICType': 'Evision.XImgProc.SLICType',
    'ximgproc.ThinningTypes': 'Evision.XImgProc.ThinningTypes',
    'ximgproc.WMFWeightType': 'Evision.XImgProc.WMFWeightType',
    'img_hash.BlockMeanHashMode': 'Evision.ImgHash.BlockMeanHashMode',
    'structured_light': 'Evision.StructuredLight',
    'stereo': 'Evision.Stereo',
    'detail.TestOp': 'Evision.Detail.TestOp',
    'cuda.HostMem.AllocType': 'Evision.CUDA.HostMem.AllocType',
    'cuda.Event.CreateFlags': 'Evision.CUDA.Event.CreateFlags',
    'cuda.FeatureSet': 'Evision.CUDA.FeatureSet',
    'cuda.DeviceInfo.ComputeMode': 'Evision.CUDA.DeviceInfo.ComputeMode',
    '_InputArray.KindFlag': 'Evision.Mat.KindFlag',
    '_OutputArray.DepthMask': 'Evision.Mat.DepthMask',
    'ocl.Device': 'Evision.OCL.Device',
    'ocl.KernelArg': 'Evision.OCL.KernelArg',
    'ocl.OclVectorStrategy': 'Evision.OCL.OclVectorStrategy',
    'ogl.Buffer.Target': 'Evision.OGL.Buffer.Target',
    'ogl.Buffer.Access': 'Evision.OGL.Buffer.Access',
    'ogl.Texture2D.Format': 'Evision.OGL.Texture2D.Format',
    'ogl.RenderModes': 'Evision.OGL.RenderModes',
    'flann.FlannIndexType': 'Evision.Flann.FlannIndexType',
    'ml.VariableTypes': 'Evision.ML.VariableTypes',
    'ml.ErrorTypes': 'Evision.ML.ErrorTypes',
    'ml.SampleTypes': 'Evision.ML.SampleTypes',
    'ml.StatModel.Flags': 'Evision.ML.StatModel.Flags',
    'ml.KNearest.Types': 'Evision.ML.KNearest.Types',
    'ml.SVM.Types': 'Evision.ML.SVM.Types',
    'ml.SVM.KernelTypes': 'Evision.ML.SVM.KernelTypes',
    'ml.SVM.ParamTypes': 'Evision.ML.SVM.ParamTypes',
    'ml.EM.Types': 'Evision.ML.EM.Types',
    'ml.EM': 'Evision.ML.EM',
    'ml.DTrees.Flags': 'Evision.ML.DTrees.Flags',
    'ml.Boost.Types': 'Evision.ML.Boost.Types',
    'ml.ANN_MLP.TrainingMethods': 'Evision.ML.ANN_MLP.TrainingMethods',
    'ml.ANN_MLP.ActivationFunctions': 'Evision.ML.ANN_MLP.ActivationFunctions',
    'ml.ANN_MLP.TrainFlags': 'Evision.ML.ANN_MLP.TrainFlags',
    'ml.LogisticRegression.RegKinds': 'Evision.ML.LogisticRegression.RegKinds',
    'ml.SVMSGD.SvmsgdType': 'Evision.ML.SVMSGD.SvmsgdType',
    'xphoto.TransformTypes': 'Evision.XPhoto.TransformTypes',
    'xphoto.Bm3dSteps': 'Evision.XPhoto.Bm3dSteps',
    'xphoto.InpaintTypes': 'Evision.XPhoto.InpaintTypes',
    'dnn.Backend': 'Evision.DNN.Backend',
    'dnn.Target': 'Evision.DNN.Target',
    'dnn.DataLayout': 'Evision.DNN.DataLayout',
    'dnn.ImagePaddingMode': 'Evision.DNN.ImagePaddingMode',
    'dnn.SoftNMSMethod': 'Evision.DNN.SoftNMSMethod',
    # Exposed by upstream 4.13's preprocessor-aware hdr_parser; the older
    # parser silently skipped these blocks.
    'instr.TYPE': 'Evision.Instr.TYPE',
    'instr.IMPL': 'Evision.Instr.IMPL',
    'instr.FLAGS': 'Evision.Instr.FLAGS',
    'utils.logging.LogLevel': 'Evision.Utils.Logging.LogLevel',
}
