r"""
    Tries to make a sensible default docstr so the user
    can fill things in without typing too much

    # TODO: Interleave old documentation with new documentation

    Args:
        func (function): live python function
        with_args (bool):
        with_ret (bool): (Defaults to True)
        with_commandline (bool): (Defaults to True)
        with_example (bool): (Defaults to True)
        with_header (bool): (Defaults to False)
        with_debug (bool): (Defaults to False)

    Returns:
        tuple: (argname, val)

    Ignore:
        pass

    CommandLine:
        python -m utool.util_autogen --exec-make_default_docstr --show

    Example:
        >>> # ENABLE_DOCTEST
        >>> from utool.util_autogen import *  # NOQA
        >>> import utool as ut
        >>> func = ut.make_default_docstr
        >>> #func = ut.make_args_docstr
        >>> #func = PythonStatement
        >>> func = auto_docstr
        >>> default_docstr = make_default_docstr(func)
        >>> result = str(default_docstr)
        >>> print(result)

def make_default_docstr(func, with_args=True, with_ret=True,
                        with_commandline=True, with_example=True,
                        with_header=False, with_debug=False):
    r"""
    Tries to make a sensible default docstr so the user
    can fill things in without typing too much

    # TODO: Interleave old documentation with new documentation

    Args:
        func (function): live python function
        with_args (bool):
        with_ret (bool): (Defaults to True)
        with_commandline (bool): (Defaults to True)
        with_example (bool): (Defaults to True)
        with_header (bool): (Defaults to False)
        with_debug (bool): (Defaults to False)

    Returns:
        tuple: (argname, val)

    Ignore:
        pass

    CommandLine:
        python -m utool.util_autogen --exec-make_default_docstr --show

    Example:
        >>> # ENABLE_DOCTEST
        >>> from utool.util_autogen import *  # NOQA
        >>> import utool as ut
        >>> func = ut.make_default_docstr
        >>> #func = ut.make_args_docstr
        >>> #func = PythonStatement
        >>> func = auto_docstr
        >>> default_docstr = make_default_docstr(func)
        >>> result = str(default_docstr)
        >>> print(result)

    """
    import utool as ut
    #from utool import util_inspect
    funcinfo = ut.util_inspect.infer_function_info(func)

    argname_list   = funcinfo.argname_list
    argtype_list   = funcinfo.argtype_list
    argdesc_list   = funcinfo.argdesc_list
    return_header  = funcinfo.return_header
    return_type    = funcinfo.return_type
    return_name    = funcinfo.return_name
    return_desc    = funcinfo.return_desc
    funcname       = funcinfo.funcname
    modname        = funcinfo.modname
    defaults       = funcinfo.defaults
    num_indent     = funcinfo.num_indent
    needs_surround = funcinfo.needs_surround
    funcname       = funcinfo.funcname
    ismethod       = funcinfo.ismethod
    va_name        = funcinfo.va_name
    kw_name        = funcinfo.kw_name
    kw_keys        = funcinfo.kw_keys

    docstr_parts = []
    # Header part
    if with_header:
        header_block = funcname
        docstr_parts.append(header_block)

    # Args part
    if with_args and len(argname_list) > 0:
        argheader = 'Args'
        arg_docstr = make_args_docstr(argname_list, argtype_list, argdesc_list,
                                      ismethod, va_name, kw_name, kw_keys)
        argsblock = make_docstr_block(argheader, arg_docstr)

        docstr_parts.append(argsblock)

    # if False:
    #     with_kw = with_args
    #     if with_kw and len(kwarg_keys) > 0:
    #         #ut.embed()
    #         import textwrap
    #         kwargs_docstr = ', '.join(kwarg_keys)
    #         kwargs_docstr = '\n'.join(textwrap.wrap(kwargs_docstr))
    #         kwargsblock = make_docstr_block('Kwargs', kwargs_docstr)
    #         docstr_parts.append(kwargsblock)

    # Return / Yeild part
    if with_ret and return_header is not None:
        if return_header is not None:
            return_doctr = make_returns_or_yeilds_docstr(return_type, return_name, return_desc)
            returnblock = make_docstr_block(return_header, return_doctr)
            docstr_parts.append(returnblock)

    # Example part
    # try to generate a simple and unit testable example
    if with_commandline:
        cmdlineheader = 'CommandLine'
        cmdlinecode = make_cmdline_docstr(funcname, modname)
        cmdlineblock = make_docstr_block(cmdlineheader, cmdlinecode)
        docstr_parts.append(cmdlineblock)

    if with_example:
        exampleheader = 'Example'
        examplecode = make_example_docstr(funcname, modname, argname_list,
                                          defaults, return_type, return_name,
                                          ismethod)
        examplecode_ = ut.indent(examplecode, '>>> ')
        exampleblock = make_docstr_block(exampleheader, examplecode_)
        docstr_parts.append(exampleblock)

    # DEBUG part (in case something goes wrong)
    if with_debug:
        debugheader = 'Debug'
        debugblock = ut.codeblock(
            '''
            num_indent = {num_indent}
            '''
        ).format(num_indent=num_indent)
        debugblock = make_docstr_block(debugheader, debugblock)
        docstr_parts.append(debugblock)

    # Enclosure / Indentation Parts
    if needs_surround:
        docstr_parts = ['r"""'] + ['\n\n'.join(docstr_parts)] + ['"""']
        default_docstr = '\n'.join(docstr_parts)
    else:
        default_docstr = '\n\n'.join(docstr_parts)

    docstr_indent = ' ' * (num_indent + 4)
    default_docstr = ut.indent(default_docstr, docstr_indent)
    return default_docstr