# encoding: utf-8

"""This is the official entry point to IPython's configuration system.  """

__docformat__ = "restructuredtext en"

#-------------------------------------------------------------------------------
#  Copyright (C) 2008  The IPython Development Team
#
#  Distributed under the terms of the BSD License.  The full license is in
#  the file COPYING, distributed as part of this software.
#-------------------------------------------------------------------------------

#-------------------------------------------------------------------------------
# Imports
#-------------------------------------------------------------------------------

import os
from IPython.config.cutils import get_home_dir, get_ipython_dir
from IPython.external.configobj import ConfigObj

# Traitlets config imports
from IPython.config import traitlets
from IPython.config.config import *
from traitlets import *

class ConfigObjManager(object):
    
    def __init__(self, configObj, filename):
        self.current = configObj
        self.current.indent_type = '    '
        self.filename = filename
        # self.write_default_config_file()
        
    def get_config_obj(self):
        return self.current
    
    def update_config_obj(self, newConfig):
        self.current.merge(newConfig)
        
    def update_config_obj_from_file(self, filename):
        newConfig = ConfigObj(filename, file_error=False)
        self.current.merge(newConfig)
        
    def update_config_obj_from_default_file(self, ipythondir=None):
        fname = self.resolve_file_path(self.filename, ipythondir)
        self.update_config_obj_from_file(fname)

    def write_config_obj_to_file(self, filename):
        f = open(filename, 'w')
        self.current.write(f)
        f.close()

    def write_default_config_file(self):
        ipdir = get_ipython_dir()
        fname = ipdir + '/' + self.filename
        if not os.path.isfile(fname):
            print "Writing the configuration file to: " + fname
            self.write_config_obj_to_file(fname)
    
    def _import(self, key):
        package = '.'.join(key.split('.')[0:-1])
        obj = key.split('.')[-1]
        execString = 'from %s import %s' % (package, obj)
        exec execString
        exec 'temp = %s' % obj 
        return temp

    def resolve_file_path(self, filename, ipythondir = None):
        """Resolve filenames into absolute paths.

        This function looks in the following directories in order:

        1.  In the current working directory or by absolute path with ~ expanded
        2.  In ipythondir if that is set
        3.  In the IPYTHONDIR environment variable if it exists
        4.  In the ~/.ipython directory

        Note: The IPYTHONDIR is also used by the trunk version of IPython so
               changing it will also affect it was well.
        """

        # In cwd or by absolute path with ~ expanded
        trythis = os.path.expanduser(filename)
        if os.path.isfile(trythis):
            return trythis

        # In ipythondir if it is set
        if ipythondir is not None:
            trythis = ipythondir + '/' + filename
            if os.path.isfile(trythis):
                return trythis        

        trythis = get_ipython_dir() + '/' + filename
        if os.path.isfile(trythis):
            return trythis

        return None