from ConfigParser import SafeConfigParser
import logging

class ConfigurationManager:
    """This class provides support for parsing a configuration file."""

    # The default values for a config file.
    default_config_dict = {'database' : 'test',
                           'user' : 'test',
                           'password' : None,
                           'server' : '127.0.0.1',
                           'master_nodes' : '',
                           'replicas' : '1',
                           'partitions' : '1009',
                           'name' : 'main'}

    # The default port to which master nodes listen when none is specified.
    default_master_port = 10100

    def __init__(self, file, section):
        parser = SafeConfigParser(self.default_config_dict)
        logging.debug('reading a configuration from %s', file)
        parser.read(file)
        self.parser = parser
        self.section = section

    def __getitem__(self, key):
        return self.parser.get(self.section, key)

    def getDatabase(self):
        return self['database']

    def getUser(self):
        return self['user']

    def getPassword(self):
        return self['password']

    def getServer(self):
        server = self['server']
        if ':' in server:
            ip_address, port = server.split(':')
            port = int(port)
        else:
            ip_address = server
            port = self.default_master_port
        return ip_address, port

    def getReplicas(self):
        return int(self['replicas'])

    def getPartitions(self):
        return int(self['partitions'])

    def getName(self):
        return self['name']

    def getMasterNodeList(self):
        master_nodes = self['master_nodes']
        master_node_list = []
        # A list of master nodes separated by whitespace.
        for node in master_nodes.split():
            if not node:
                continue
            if ':' in node:
                ip_address, port = node.split(':')
                port = int(port)
            else:
                ip_address = node
                port = self.default_master_port
            master_node_list.append((ip_address, port))
        return master_node_list