# Copyright (C) 2011 Igalia S.L.
# Copyright (C) 2012 Intel Corporation
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

import multiprocessing
import sys
import os
import platform


script_dir = None


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


def top_level_path(*args):
    return os.path.join(*((os.path.join(os.path.dirname(__file__), '..', '..'),) + args))


def init(jhbuildrc_globals, jhbuild_platform):

    __tools_directory = os.path.join(os.path.dirname(__file__), "../", jhbuild_platform)
    sys.path.insert(0, __tools_directory)

    jhbuildrc_globals["build_policy"] = 'updated'

    __moduleset_file_name = 'jhbuild.modules'
    if 'WEBKIT_JHBUILD_MODULESET' in os.environ:
        __moduleset_file_name = 'jhbuild-%s.modules' % os.environ['WEBKIT_JHBUILD_MODULESET']
    __moduleset_file_path = os.path.join(__tools_directory, __moduleset_file_name)
    if not os.path.isfile(__moduleset_file_path):
        raise RuntimeError("Can't find the moduleset in path %s" % __moduleset_file_path)
    __moduleset_file_uri = 'file://' + __moduleset_file_path

    __extra_modulesets = os.environ.get("WEBKIT_EXTRA_MODULESETS", "").split(",")
    jhbuildrc_globals["moduleset"] = [__moduleset_file_uri, ]
    if __extra_modulesets != ['']:
        jhbuildrc_globals["moduleset"].extend(__extra_modulesets)

    __extra_modules = os.environ.get("WEBKIT_EXTRA_MODULES", "").split(",")

    base_dependency_suffix = 'testing'
    if 'WEBKIT_JHBUILD_MODULESET' in os.environ:
        base_dependency_suffix = os.environ['WEBKIT_JHBUILD_MODULESET']

    jhbuildrc_globals["modules"] = ['webkit' + jhbuild_platform + '-' + base_dependency_suffix + '-dependencies', ]
    if __extra_modules != ['']:
        jhbuildrc_globals["modules"].extend(__extra_modules)

    if 'WEBKIT_OUTPUTDIR' in os.environ:
        jhbuildrc_globals["checkoutroot"] = checkoutroot = os.path.abspath(os.path.join(os.environ['WEBKIT_OUTPUTDIR'], 'Dependencies' + jhbuild_platform.upper(), 'Source'))
        jhbuildrc_globals["prefix"] = os.path.abspath(os.path.join(os.environ['WEBKIT_OUTPUTDIR'], 'Dependencies' + jhbuild_platform.upper(), 'Root'))
    else:
        jhbuildrc_globals["checkoutroot"] = checkoutroot = os.path.abspath(top_level_path('WebKitBuild', 'Dependencies' + jhbuild_platform.upper(), 'Source'))
        jhbuildrc_globals["prefix"] = os.path.abspath(top_level_path('WebKitBuild', 'Dependencies' + jhbuild_platform.upper(), 'Root'))

    jhbuildrc_globals["nonotify"] = True
    jhbuildrc_globals["notrayicon"] = True

    if 'NUMBER_OF_PROCESSORS' in os.environ:
        jhbuildrc_globals['jobs'] = os.environ['NUMBER_OF_PROCESSORS']

    if os.environ.get("WEBKIT_JHBUILD_MODULESET") != "minimal":
        # Avoid runtime conflicts with GStreamer system-wide plugins. We want
        # to use only the plugins we build in JHBuild.
        os.environ['GST_PLUGIN_SYSTEM_PATH'] = ''

    addpath = jhbuildrc_globals['addpath']

    prefix = jhbuildrc_globals['prefix']
    addpath('CMAKE_PREFIX_PATH', prefix)
    addpath('CMAKE_LIBRARY_PATH', os.path.join(prefix, 'lib'))

    if 'JHBUILD_MIRROR' in os.environ:
        jhbuildrc_globals['dvcs_mirror_dir'] = os.environ['JHBUILD_MIRROR']
        jhbuildrc_globals['tarballdir'] = os.environ['JHBUILD_MIRROR']

    if 'x86_64' in platform.machine():
        jhbuildrc_globals['conditions'].add('x86_64')

    if 'JHBUILD_ENABLE_THUNDER' in os.environ:
        jhbuild_enable_thunder = os.environ['JHBUILD_ENABLE_THUNDER'].lower()
        if jhbuild_enable_thunder == 'yes' or jhbuild_enable_thunder == '1' or jhbuild_enable_thunder == 'true':
            jhbuildrc_globals['conditions'].add('Thunder')
