#
#  Copyright (C) 2016 Codethink Limited
#
#  This program 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, see <http://www.gnu.org/licenses/>.
#
#  Authors:
#        Tristan Van Berkom <tristan.vanberkom@codethink.co.uk>

import os
import shutil
import subprocess

#
# Private module declaring some info about where the buildstream
# is installed so we can lookup package relative resources easily
#

# The package root, wherever we are running the package from
root = os.path.dirname(os.path.abspath(__file__))

# The Element plugin directory
element_plugins = os.path.join(root, 'plugins', 'elements')

# The Source plugin directory
source_plugins = os.path.join(root, 'plugins', 'sources')

# Default user configuration
default_user_config = os.path.join(root, 'data', 'userconfig.yaml')

# Default project configuration
default_project_config = os.path.join(root, 'data', 'projectconfig.yaml')

# Script template to call module building scripts
build_all_template = os.path.join(root, 'data', 'build-all.sh.in')

# Module building script template
build_module_template = os.path.join(root, 'data', 'build-module.sh.in')


def get_bwrap_version():
    # Get the current bwrap version
    #
    # returns None if no bwrap was found
    # otherwise returns a tuple of 3 int: major, minor, patch
    bwrap_path = shutil.which('bwrap')

    if not bwrap_path:
        return None

    cmd = [bwrap_path, "--version"]
    try:
        version = str(subprocess.check_output(cmd).split()[1], "utf-8")
    except subprocess.CalledProcessError:
        return None

    return tuple(int(x) for x in version.split("."))
