#!/usr/bin/env python3
#
#  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 inspect
import pkg_resources

from ._exceptions import PluginError
from . import utils


# A Context for loading plugin types
#
# Args:
#     plugin_base (PluginBase): The main PluginBase object to work with
#     base_type (type):         A base object type for this context
#     searchpath (list):        A list of paths to search for plugins
#
# Since multiple pipelines can be processed recursively
# within the same interpretor, it's important that we have
# one context associated to the processing of a given pipeline,
# this way sources and element types which are particular to
# a given BuildStream project are isolated to their respective
# Pipelines.
#
class PluginContext():

    def __init__(self, plugin_base, base_type, searchpath=None, dependencies=None):

        if not searchpath:
            raise PluginError("Cannot create plugin context without any searchpath")

        self.dependencies = dependencies
        self.loaded_dependencies = []
        self.base_type = base_type  # The base class plugins derive from
        self.types = {}             # Plugin type lookup table by kind

        # Raise an error if we have more than one plugin with the same name
        self.assert_searchpath(searchpath)

        # The PluginSource object
        self.plugin_base = plugin_base
        self.source = plugin_base.make_plugin_source(searchpath=searchpath)
        self.alternate_sources = []

    # lookup():
    #
    # Fetches a type loaded from a plugin in this plugin context
    #
    # Args:
    #     kind (str): The kind of Plugin to create
    #
    # Returns: the type associated with the given kind
    #
    # Raises: PluginError
    #
    def lookup(self, kind):
        return self.ensure_plugin(kind)

    def ensure_plugin(self, kind):

        if kind not in self.types:
            source = None
            defaults = None
            dist, package = self.split_name(kind)

            if dist:
                # Find the plugin on disk using setuptools - this
                # potentially unpacks the file and puts it in a
                # temporary directory, but it is otherwise guaranteed
                # to exist.
                try:
                    plugin = pkg_resources.get_entry_info(dist, 'buildstream.plugins', package)
                except pkg_resources.DistributionNotFound as e:
                    raise PluginError("Failed to load {} plugin '{}': {}"
                                      .format(self.base_type.__name__, kind, e)) from e

                # Missing plugins will return as 'None'
                if plugin is not None:
                    location = plugin.dist.get_resource_filename(
                        pkg_resources._manager,
                        plugin.module_name.replace('.', os.sep) + '.py'
                    )

                    # Also load the defaults - required since setuptools
                    # may need to extract the file.
                    defaults = plugin.dist.get_resource_filename(
                        pkg_resources._manager,
                        plugin.module_name.replace('.', os.sep) + '.yaml'
                    )

                    # Set the plugin-base source to the setuptools directory
                    source = self.plugin_base.make_plugin_source(searchpath=[os.path.dirname(location)])
                    # Ensure the plugin sources aren't garbage
                    # collected - if they are, they take any loaded
                    # plugins with them, regardless of whether those
                    # have remaining references or not.
                    self.alternate_sources.append(source)

            elif package in self.source.list_plugins():
                source = self.source

            if not source:
                raise PluginError("No {} type registered for kind '{}'"
                                  .format(self.base_type.__name__, kind))
            self.types[kind] = self.load_plugin(source, package, defaults)

            if dist:
                self.loaded_dependencies.append(kind)

        return self.types[kind]

    def load_plugin(self, source, kind, defaults):

        try:
            plugin = source.load_plugin(kind)

            if not defaults:
                plugin_file = inspect.getfile(plugin)
                plugin_dir = os.path.dirname(plugin_file)
                plugin_conf_name = "{}.yaml".format(kind)
                defaults = os.path.join(plugin_dir, plugin_conf_name)

        except ImportError as e:
            raise PluginError("Failed to load {} plugin '{}': {}"
                              .format(self.base_type.__name__, kind, e)) from e

        try:
            plugin_type = plugin.setup()
        except AttributeError as e:
            raise PluginError("{} plugin '{}' did not provide a setup() function"
                              .format(self.base_type.__name__, kind)) from e
        except TypeError as e:
            raise PluginError("setup symbol in {} plugin '{}' is not a function"
                              .format(self.base_type.__name__, kind)) from e

        self.assert_plugin(kind, plugin_type)
        self.assert_version(kind, plugin_type)
        return (plugin_type, defaults)

    def split_name(self, name):
        if name.count(':') > 1:
            raise PluginError("Plugin and package names must not contain ':'")

        try:
            dist, kind = name.split(':', maxsplit=1)
        except ValueError:
            dist = None
            kind = name

        return dist, kind

    def assert_plugin(self, kind, plugin_type):
        if kind in self.types:
            raise PluginError("Tried to register {} plugin for existing kind '{}' "
                              "(already registered {})"
                              .format(self.base_type.__name__, kind, self.types[kind].__name__))
        try:
            if not issubclass(plugin_type, self.base_type):
                raise PluginError("{} plugin '{}' returned type '{}', which is not a subclass of {}"
                                  .format(self.base_type.__name__, kind,
                                          plugin_type.__name__,
                                          self.base_type.__name__))
        except TypeError as e:
            raise PluginError("{} plugin '{}' returned something that is not a type (expected subclass of {})"
                              .format(self.base_type.__name__, kind,
                                      self.base_type.__name__)) from e

    def assert_version(self, kind, plugin_type):

        # Now assert BuildStream version
        bst_major, bst_minor = utils.get_bst_version()

        if bst_major < plugin_type.BST_REQUIRED_VERSION_MAJOR or \
           (bst_major == plugin_type.BST_REQUIRED_VERSION_MAJOR and
            bst_minor < plugin_type.BST_REQUIRED_VERSION_MINOR):
            raise PluginError("BuildStream {}.{} is too old for {} plugin '{}' (requires {}.{})"
                              .format(
                                  bst_major, bst_minor,
                                  self.base_type.__name__, kind,
                                  plugin_type.BST_REQUIRED_VERSION_MAJOR,
                                  plugin_type.BST_REQUIRED_VERSION_MINOR))

    # We want a PluginError when trying to create a context
    # where more than one plugin has the same name
    def assert_searchpath(self, searchpath):
        names = []
        fullnames = []
        for path in searchpath:
            for filename in os.listdir(path):
                basename = os.path.basename(filename)
                name, extension = os.path.splitext(basename)
                if extension == '.py' and name != '__init__':
                    fullname = os.path.join(path, filename)

                    if name in names:
                        idx = names.index(name)
                        raise PluginError("Failed to register {} plugin '{}' from: {}\n"
                                          "{} plugin '{}' is already registered by: {}"
                                          .format(self.base_type.__name__, name, fullname,
                                                  self.base_type.__name__, name, fullnames[idx]))

                    names.append(name)
                    fullnames.append(fullname)
