from benedict.core import clone
from benedict.dicts.keylist import keylist_util
from benedict.utils import type_util


def _unflatten_item(key, value, separator):
    keys = key.split(separator)
    if type_util.is_dict(value):
        return (keys, unflatten(value, separator=separator))
    return (keys, value)


def unflatten(d, separator="_"):
    new_dict = clone(d, empty=True)
    keys = list(d.keys())
    for key in keys:
        value = d.get(key, None)
        new_keys, new_value = _unflatten_item(key, value, separator)
        keylist_util.set_item(new_dict, new_keys, new_value)
    return new_dict
