import inspect


def inspect_missing_functions(original_type, target_type):
    """
    Find functions which exist in original_type but not in target_type,
    or the signature is modified.

    :return: the tuple of the missing function name and its signature,
             and the name of the functions the signature of which is different
             and its original and modified signature.
    """
    missing = []
    deprecated = []
    modified = []

    for name, func in inspect.getmembers(original_type, inspect.isfunction):
        # Skip the private attributes
        if name.startswith('_'):
            continue

        original_signature = inspect.signature(func, follow_wrapped=True)

        if hasattr(target_type, name):
            f = getattr(target_type, name)
            if inspect.isfunction(f):
                target_signature = inspect.signature(f)
                if str(original_signature) != str(target_signature):
                    modified.append((name, original_signature, target_signature))
                continue

        docstring = func.__doc__
        # Use line break and indent to only cover deprecated method, not deprecated parameters
        if docstring and ('\n        .. deprecated::' in docstring):
            deprecated.append((name, original_signature))
        else:
            missing.append((name, original_signature))

    return missing, deprecated, modified