from django.core.exceptions import ImproperlyConfigured


def _collect(name, parser):
    collector = getattr(name, 'collect', None)
    if callable(collector):
        return collector(parser)
    return name


class BlockDefinition:
    """
    Definition of 'parse-until-blocks' used by the parser.
    """
    def __init__(self, alias, *names):
        self.alias = alias
        self.names = names

    def validate(self, options):
        for name in self.names:
            validator = getattr(name, 'validate', None)
            if callable(validator):
                validator(options)

    def collect(self, parser):
        return [_collect(name, parser) for name in self.names]


class VariableBlockName:
    def __init__(self, template, argname):
        self.template = template
        self.argname = argname

    def validate(self, options):
        if self.argname not in options.all_argument_names:
            raise ImproperlyConfigured(
                "Invalid block definition, %r not a valid argument name, "
                "available argument names: %r" % (self.argname,
                                                  options.all_argument_names)
            )

    def collect(self, parser):
        value = parser.kwargs[self.argname]
        return self.template % {'value': value.literal}
