from copy import copy

from omegaconf import OmegaConf


class BaseEstimator:
    base_default_conf = {
        "name": "???",
        "ransac_th": "???",
    }
    test_thresholds = [1.0]
    required_data_keys = []

    strict_conf = False

    def __init__(self, conf):
        """Perform some logic and call the _init method of the child model."""
        default_conf = OmegaConf.merge(self.base_default_conf, OmegaConf.create(self.default_conf))
        if self.strict_conf:
            OmegaConf.set_struct(default_conf, True)

        if isinstance(conf, dict):
            conf = OmegaConf.create(conf)
        self.conf = conf = OmegaConf.merge(default_conf, conf)
        OmegaConf.set_readonly(conf, True)
        OmegaConf.set_struct(conf, True)
        self.required_data_keys = copy(self.required_data_keys)
        self._init(conf)

    def __call__(self, data):
        return self._forward(data)
