import gettext
import glob
import os.path
import sys
import __builtin__

top_level_dir = None


def top_level_path(*args):
    global top_level_dir
    if not top_level_dir:
        top_level_dir = os.path.join(os.path.dirname(__file__), '..', '..')
    return os.path.join(*(top_level_dir,) + args)


def get_dependencies_path(platform):
    dependencies_dir = "%s%s" % ('Dependencies', platform.upper())
    if 'WEBKIT_OUTPUTDIR' in os.environ:
        return os.path.abspath(os.path.join(os.environ['WEBKIT_OUTPUTDIR'], dependencies_dir))
    else:
        return os.path.abspath(top_level_path('WebKitBuild', dependencies_dir))


def get_config_file_for_platform(platform):
    return top_level_path('Tools', platform, 'jhbuildrc')


def enter_jhbuild_environment_if_available(platform):
    if not os.path.exists(get_dependencies_path(platform)):
        return False

    # Sometimes jhbuild chooses to install in a way that reads the library from the source directory, so fall
    # back to that method.
    source_path = os.path.join(get_dependencies_path(platform), "Source", "jhbuild")
    sys.path.insert(0, source_path)

    # When loading jhbuild from the source checkout it fails if the SRCDIR, PKGDATADIR or DATADIR aren't present.
    __builtin__.__dict__['SRCDIR'] = source_path
    __builtin__.__dict__['PKGDATADIR'] = None
    __builtin__.__dict__['DATADIR'] = None

    # We don't know the Python version, so we just assume that we can safely take the first one in the list.
    site_packages_path = glob.glob(os.path.join(get_dependencies_path(platform), "Root", "lib", "*", "site-packages"))
    if len(site_packages_path):
       site_packages_path = site_packages_path[0]
       sys.path.insert(0, site_packages_path)

    try:
        import jhbuild.config
        from jhbuild.errors import FatalError
        gettext.install('jhbuild', localedir=os.path.join(source_path, 'mo'), unicode=True)
        config = jhbuild.config.Config(get_config_file_for_platform(platform), [])
    except FatalError as exception:
        sys.stderr.write('Could not load jhbuild config file: %s\n' % exception.args[0])
        return False

    return True
