import os

class PreconfigManager(object):
    _preconfigs = {}
    _is_init = False

    def _get_preconfig_path(self, suffix):
        """\
        Get the absolute path to a prefix directory or file.

        suffix: list of suffixes after the 'preconfigs' directory to navigate to
            E.g., ['metrics', 'abc'] gives the path to
            <tko>/preconfigs/metrics/abc
        """
        rel_path = os.path.join(os.path.dirname(__file__), 'preconfigs',
                                *suffix)
        return os.path.abspath(rel_path)


    def _init_preconfigs(self):
        """\
        Read the names of all the preconfigs from disk and store them in the
        _preconfigs dictionary.
        """
        if not self._is_init:
            # Read the data
            self._preconfigs['metrics'] = dict.fromkeys(
                os.listdir(self._get_preconfig_path(['metrics'])))
            self._preconfigs['qual'] = dict.fromkeys(
                os.listdir(self._get_preconfig_path(['qual'])))
            self._is_init = True

    def _read_preconfig(self, name, type):
        """\
        Populate the _preconfigs dictionary entry for the preconfig described
        by the given parameters.  If the preconfig has already been loaded,
        do nothing.

        name: specific name of the preconfig
        type: 'metrics' or 'qual'
        """
        if self._preconfigs[type][name] is not None:
            return

        self._preconfigs[type][name] = {}
        path = self._get_preconfig_path([type, name])
        config = open(path)
        try:
            for line in config:
                parts = line.split(':')
                self._preconfigs[type][name][parts[0]] = parts[1].strip()
        finally:
            config.close()


    def get_preconfig(self, name, type):
        self._init_preconfigs()
        self._read_preconfig(name, type)
        return self._preconfigs[type][name]


    def all_preconfigs(self):
        self._init_preconfigs()
        return dict(self._preconfigs)


manager = PreconfigManager()