from __future__ import unicode_literals
from __future__ import print_function

from .compat import quote_plus, text_type


def _iter_qs_map(qs_map):
    for k, v in qs_map.items():
        if isinstance(v, list):
            for _v in v:
                yield k, _v
        else:
            yield k, v


def urlencode(query, _quote_plus=quote_plus, _iter_qs=_iter_qs_map):
    """url encode a mapping of query string values"""
    # Works slightly differently to Pythons urlencode
    # This function accepts lists and values, to generate multiple keys. e.g {'foo': ['bar', 'baz']} -> "foo=bar&foo=baz"
    # It will also remove the = if the value is empty, e.g. {'foo': ''} -> "foo"
    qs = "&".join("{}={}".format(_quote_plus(k), _quote_plus(v)) if text_type(v) else _quote_plus(k)
                  for k, v in _iter_qs(query))
    return qs
