#!/usr/bin/env python3
# -*- encoding: utf-8 -*-
# Michel Mooij, michel.mooij7@gmail.com

import waflib
from waflib import Utils, Errors


def get_deps(bld, target):
    '''Returns a list of (nested) targets on which this target depends.
    
    :param bld: a *waf* build instance from the top level *wscript*
    :type bld: waflib.Build.BuildContext
    :param target: task name for which the dependencies should be returned
    :type target: str
    :returns: a list of task names on which the given target depends
    '''
    try:
        tgen = bld.get_tgen_by_name(target)
    except Errors.WafError:
        return []
    else:
        uses = Utils.to_list(getattr(tgen, 'use', []))
        deps = uses[:]
        for use in uses:
            deps += get_deps(bld, use)
        return list(set(deps))


def get_tgens(bld, names):
    '''Returns a list of task generators based on the given list of task
    generator names.
    
    :param bld: a *waf* build instance from the top level *wscript*
    :type bld: waflib.Build.BuildContext
    :param names: list of task generator names
    :type names: list of str
    :returns: list of task generators
    '''
    tgens=[]
    for name in names:
        try:
            tgen = bld.get_tgen_by_name(name)
        except Errors.WafError:
            pass
        else:
            tgens.append(tgen)
    return list(set(tgens))


def get_targets(bld):
    '''Returns a list of user specified build targets or None if no specific
    build targets has been selected using the *--targets=* command line option.

    :param bld: a *waf* build instance from the top level *wscript*.
    :type bld: waflib.Build.BuildContext
    :returns: a list of user specified target names (using --targets=x,y,z) or None
    '''
    if bld.targets == '':
        return None
    targets = bld.targets.split(',')
    for target in targets:
        targets += get_deps(bld, target)
    return targets

