__doc__ = "functions for make pretty yaml files"
__all__ = ['dumps']


def dumps_simple(val):
    bad_symbols = set(" \r\t\n,':")

    if isinstance(val, basestring):
        if len(bad_symbols & set(val)) != 0:
            return repr(val)
        return val
    elif val is True:
        return 'true'
    elif val is False:
        return 'false'
    elif val is None:
        return 'null'

    return str(val)


def is_simple(val):
    simple_type = isinstance(val, (str, unicode, int, long, bool, float))
    return simple_type or val is None


def all_nums(vals):
    return all(isinstance(val, (int, float, long)) for val in vals)


def dumpv(data, tab_sz=4, width=120, min_width=40):
    tab = ' ' * tab_sz

    if width < min_width:
        width = min_width

    res = []
    if is_simple(data):
        return [dumps_simple(data)]

    if isinstance(data, (list, tuple)):
        if all(map(is_simple, data)):
            if all_nums(data):
                one_line = "[{}]".format(", ".join(map(dumps_simple, data)))
            else:
                one_line = "[{}]".format(",".join(map(dumps_simple, data)))
        else:
            one_line = None

        if one_line is None or len(one_line) > width:
            pref = "-" + ' ' * (tab_sz - 1)

            for val in data:
                items = dumpv(val, tab_sz, width - tab_sz, min_width)
                items = [pref + items[0]] + \
                        [tab + item for item in items[1:]]
                res.extend(items)
        else:
            res.append(one_line)
    elif isinstance(data, dict):
        assert all(map(is_simple, data.keys()))

        for k, v in data.items():
            key_str = dumps_simple(k) + ": "
            val_res = dumpv(v, tab_sz, width - tab_sz, min_width)

            if len(val_res) == 1 and len(key_str + val_res[0]) < width:
                res.append(key_str + val_res[0])
            else:
                res.append(key_str)
                res.extend(tab + i for i in val_res)
    else:
        raise ValueError("Can't pack {0!r}".format(data))

    return res


def dumps(data, tab_sz=4, width=120, min_width=40):
    return "\n".join(dumpv(data, tab_sz, width, min_width))
