# -*- coding: utf-8 -*-

"""\
© Copyright. All rights reserved.

"""

from __future__ import unicode_literals

try:
    from configparser import SafeConfigParser  # before alias is removed
except ImportError as _:
    from configparser import ConfigParser as SafeConfigParser  # after alias is removed


class Config(object):

    def get(self, key, default=None):
        """\
        Get the config option as a string

        :param key: config option name
        :param default: default value if no value exists in the config
        :return: option value

        """
        raise NotImplementedError(__name__ + '.get()')

    def get_bool(self, key, default=None):
        """\
        Get the config option as a boolean

        :param key: config option name
        :param default: default value if no value exists in the config
        :return: option value

        """
        return bool(self.get(key, default))

    def get_int(self, key, default=None):
        """\
        Get the config option as an integer

        :param key: config option name
        :param default: default value if no value exists in the config
        :return: option value

        """
        return int(self.get(key, default))

    def get_float(self, key, default=None):
        """\
        Get the config option as a float

        :param key: config option name
        :param default: default value if no value exists in the config
        :return: option value

        """
        return float(self.get(key, default))


class FileConfig(Config):
    """Config class that loads configuration options from the locally-cached ZooKeeper config"""
    DEFAULT_FILENAME = '/var/cache/hfs/config.ini'
    default_section = 'config-default'

    def __init__(self, service_prefix=None, filename=None, defaults=None):
        if filename is None:
            filename = self.DEFAULT_FILENAME
        self.config = SafeConfigParser(default_section=self.default_section)
        self.config.read(filename)
        self.prefixes = []
        if service_prefix:
            prefix_parts = service_prefix.split('.')
            while prefix_parts:
                self.prefixes.append('.'.join(prefix_parts) + '.')
                prefix_parts.pop()
        self.prefixes.append('')
        self.defaults = defaults

    def _get(self, getfunc, key, default=None):
        if default is None and self.defaults:
            default = self.defaults.get(key)

        for prefix in self.prefixes:
            prefixed_key = prefix + key
            val = getfunc(self.default_section, prefixed_key, fallback=None)
            if val:
                break
        else:
            val = default
        return val

    def get(self, key, default=None):
        return self._get(self.config.get, key, default)

    def get_bool(self, key, default=None):
        return self._get(self.config.getboolean, key, default)

    def get_int(self, key, default=None):
        return self._get(self.config.getint, key, default)

    def get_float(self, key, default=None):
        return self._get(self.config.getfloat, key, default)
