#
# SPDX-License-Identifier: GPL-2.0-only
#

import itertools

def is_optional(feature, d):
    return bool(d.getVarFlag("FEATURE_PACKAGES_%s" % feature, "optional"))

def packages(features, d):
    for feature in features:
        packages = d.getVar("FEATURE_PACKAGES_%s" % feature)
        for pkg in (packages or "").split():
            yield pkg

def required_packages(features, d):
    req = [feature for feature in features if not is_optional(feature, d)]
    return packages(req, d)

def optional_packages(features, d):
    opt = [feature for feature in features if is_optional(feature, d)]
    return packages(opt, d)

def active_packages(features, d):
    return itertools.chain(required_packages(features, d),
                           optional_packages(features, d))

def active_recipes(features, d):
    import oe.packagedata

    for pkg in active_packages(features, d):
        recipe = oe.packagedata.recipename(pkg, d)
        if recipe:
            yield recipe
