from argparse import Namespace

from omegaconf import OmegaConf


class Config(Namespace):
    '''
    Simple attribute-dict config, replacing vidar.utils.config.Config.
    '''

    def __init__(self, **kwargs):
        super().__init__(**kwargs)

    @property
    def dict(self):
        return self.__dict__

    def keys(self):
        return self.dict.keys()

    def items(self):
        return self.dict.items()

    def values(self):
        return self.dict.values()

    def has(self, *args):
        node = self
        for key in args:
            if key not in node.__dict__:
                return False
            node = node.__dict__[key]
        return True

    def get(self, key, default=None):
        return self.dict[key] if key in self.keys() else default

    def __getitem__(self, key):
        return self.dict[key]

    def __contains__(self, key):
        return key in self.dict


def to_plain(cfg):
    '''
    OmegaConf container -> plain python, so ${...}-interpolated lists satisfy isinstance(x, list)
    (ListConfig does not).
    :param cfg: an OmegaConf DictConfig / ListConfig, or an already-plain value / None.
    :return: plain dict / list, or cfg unchanged when it is not an OmegaConf container.
    '''
    if OmegaConf.is_config(cfg):
        return OmegaConf.to_container(cfg, resolve=True)
    return cfg
