#
# Copyright BitBake Contributors
#
# SPDX-License-Identifier: GPL-2.0-only
#

import argparse
import logging
import os

logger = logging.getLogger('bitbake-layers')


class LayerPlugin():
    def __init__(self):
        self.tinfoil = None
        self.bblayers = []

    def tinfoil_init(self, tinfoil):
        self.tinfoil = tinfoil
        self.bblayers = (self.tinfoil.config_data.getVar('BBLAYERS') or "").split()
        layerconfs = self.tinfoil.config_data.varhistory.get_variable_items_files('BBFILE_COLLECTIONS')
        self.bbfile_collections = {layer: os.path.dirname(os.path.dirname(path)) for layer, path in layerconfs.items()}

    @staticmethod
    def add_command(subparsers, cmdname, function, parserecipes=True, *args, **kwargs):
        """Convert docstring for function to help."""
        docsplit = function.__doc__.splitlines()
        help = docsplit[0]
        if len(docsplit) > 1:
            desc = '\n'.join(docsplit[1:])
        else:
            desc = help
        subparser = subparsers.add_parser(cmdname, *args, help=help, description=desc, formatter_class=argparse.RawTextHelpFormatter, **kwargs)
        subparser.set_defaults(func=function, parserecipes=parserecipes)
        return subparser

    def get_layer_name(self, layerdir):
        return os.path.basename(layerdir.rstrip(os.sep))
