import os, base64

class lechatConfiguration(object):
    def __init__(self):
        self.read()

    def _obfuscate_password(self):
        try:
            base64.b64decode(self.password)
        except TypeError:
            self.password = base64.b64encode(self.password)
        
    def read(self):
        if os.name == 'nt':
            import _winreg

            try:
                _winreg.SetValue(_winreg.HKEY_CURRENT_USER, "Software\\lechat",
                                 _winreg.REG_SZ, "Default value")
                kh = _winreg.CreateKey(_winreg.HKEY_CURRENT_USER, "Software\\lechat")
            except:
                kh = None

            if kh:
                try:
                    self.server = _winreg.QueryValueEx(kh, "server")[0]
                except WindowsError:
                    self.server = 'localhost'

                try:
                    self.port = _winreg.QueryValueEx(kh, "port")[0]
                except WindowsError:
                    self.port = '7080'

                try:
                    self.base_dn = _winreg.QueryValueEx(kh, "base_dn")[0]
                except WindowsError:
                    self.base_dn = 'dc=abadcafe'

                try:
                    self.login = _winreg.QueryValueEx(kh, "login")[0]
                except WindowsError:
                    self.login = 'admin'
                
                try:
                    self.password = _winreg.QueryValueEx(kh, "password")[0]
                except WindowsError:
                    self.password = 'admin'

                try:
                    self.locale_dir = _winreg.QueryValueEx(kh, "locale_dir")[0]
                except WindowsError:
                    self.locale_dir = 'c:\src\lechat\dist\locale'

            else:
                self.server = 'localhost'
                self.port = '7080'
                self.base_dn = 'dc=localdomain'
                self.login = 'cn=admin,dc=localdomain'
                self.password = ''
                self.locale_dir = 'C:\Program Files\lechat\locale'
                
        else:
            conf_filename = os.path.join(os.path.expanduser('~/'), '.lechatrc')
            if not os.access(conf_filename, os.R_OK):
                try:
                    os.mknod(conf_filename)
                except:
                    critical("can't create %s" % conf_filename)
                self.server = 'localhost'
                self.port = '7080'
                self.base_dn = 'dc=localdomain'
                self.login = 'cn=admin,dc=localdomain'
                self.password = ''
                self.locale_dir = ''
            else:
                loc = {}
                execfile(conf_filename, loc)
                try:
                    self.server = loc['server']
                except KeyError:
                    self.server = 'localhost'

                try:
                    self.port = loc['port']
                except KeyError:
                    self.port = '7080'

                try:
                    self.base_dn = loc['base_dn']
                except KeyError:
                    self.base_dn = 'dc=localdomain'
                    
                try:
                    self.login = loc['login']
                except KeyError:
                    self.login = 'cn=admin,dc=localdomain'

                try:
                    self.password = loc['password']
                except KeyError:
                    self.password = ''

                try:
                    self.locale_dir = loc['locale_dir']
                except KeyError:
                    self.locale_dir = os.path.join(os.path.dirname(__file__), '../client/locale')
            self._obfuscate_password()

    def write(self):
        
        self._obfuscate_password()
        if os.name == 'nt':
            import _winreg

            try:
                _winreg.SetValue(_winreg.HKEY_CURRENT_USER, "Software\\lechat",
                                 _winreg.REG_SZ, "Default value")
                kh = _winreg.CreateKey(_winreg.HKEY_CURRENT_USER, "Software\\lechat")
            except:
                kh = None

            if kh:
                _winreg.SetValueEx(kh, "server", 0, _winreg.REG_SZ, self.server)
                _winreg.SetValueEx(kh, "port", 0, _winreg.REG_SZ, self.port)
                _winreg.SetValueEx(kh, "base_dn", 0, _winreg.REG_SZ, self.base_dn)
                _winreg.SetValueEx(kh, "login", 0, _winreg.REG_SZ, self.login)
                _winreg.SetValueEx(kh, "password", 0, _winreg.REG_SZ, self.password)
                _winreg.SetValueEx(kh, "locale_dir", 0, _winreg.REG_SZ, self.locale_dir)
        else:
            conf_filename = os.path.join(os.path.expanduser('~'), '.lechatrc')
            if not os.access(conf_filename, os.W_OK):
                try:
                    os.mknod(conf_filename)
                except:
                    debug("can't create %s" % conf_filename)
            conf_file = open(conf_filename, 'w')
            conf_file.write('server = "%s"\nport = "%s"\nbase_dn = "%s"\nlogin = "%s"\npassword = "%s"\nlocale_dir = "%s"\n'
                            % (self.server, self.port, self.base_dn, self.login, self.password, self.locale_dir ))

